2015-03-14 5 views
0

У меня есть много названных аннотированных экземпляров класса TabularResultSet, которые я хочу передать нескольким классам в статическое конечное свойство. Как это сделать? Я не думаю, что это нравится окончательный и статический характер собственности. Должен ли я вызвать инжектор непосредственно в объявлении свойства, чтобы присвоить значение?Inject Guice на статичное конечное свойство?

ответ

2

Можно ввести Guice в статические поля. См. Static Injections в документации Guice.

Но я не уверен насчет static final. final поля также несут гарантию, что они инициализируются ровно один раз (если не используется отражение). Guice может работать над этим, используя отражение (я знаю, что Guice может вводить поля @Inject private final с использованием отражения), но это довольно грязное решение. Если значение поля всегда установлено за пределами статического блока инициализации (для static) или конструктора (для полей не static), то он не должен иметь final.

Но даже если это возможно, это не очень хорошая идея. Статическое состояние противоположно инъекции зависимостей. Инъекционная инъекция основана на Голливудском принципе: «Не звоните нам, мы вам позвоним». Вы не должны найти значение от Guice, вы должны просто заявить, что вам это нужно, и Guice предоставит его вам.

+0

hmmm ... многие из моих проектов классов часто включают класс, представляющий экземпляр чего-либо, и все экземпляры сохраняются в статической окончательной коллекции, которая импортируется из базы данных. Этот дизайн всегда был успешным для меня. Но, возможно, Guice здесь не работает или я не создаю оптимальную настройку. – tmn

+1

У вас может быть коллекция, импортированная из базы данных, просто не делайте ее статической коллекцией. Вместо этого свяжите его с помощью модуля Guice и введите его там, где он вам нужен. Вы даже можете сделать Guice '@ Singleton', если вы хотите только один экземпляр, но если вы введете его в классы, которые в нем нуждаются (вместо того, чтобы искать его из статического поля), то вы можете заменить не- Singleton в будущем (или, что более полезно, в тестах). –

+0

@ThomasN. если данные импортируются из базы данных, то вы хотите ввести класс, который обращается к данным (возможно, кэширование или ленивая загрузка), а не сами данные. Ваши модули Guice не должны делать что-то медленное, как доступ к базе данных – NamshubWriter

Смежные вопросы