Guice - использовать введенное поле внутри конструктора

Есть ли способ использовать введенные поля внутри конструктора по умолчанию? Ниже псевдокод -

public class SomeClass() {
    @Inject private SomeField someField;
    @Inject private SomeOtherField someOtherField;

    private SomeImportantObject someImportantObject;

    public SomeClass() {
        SomeBuilder
            .get()
            .withFieldValue( someField.getValue() )
            .withSomeOtherFieldValue( someOtherField.getValue() )
            .build();
    }
}

Теперь проблема, с которой я столкнулся, заключается в том, что когда я звоню injector.getInstance( SomeClass.class ), я получаю NullPointerException.

Caused by: java.lang.NullPointerException
    at com.something.something.SomeClass.<init>(SomeClass.java:10)

Теперь я понимаю, что это происходит потому, что конструктор по умолчанию вызывается до внедрения зависимостей.

Но есть ли способ, чтобы зависимости можно было внедрить раньше?
Или, что лучше сделать?

Note, I do not want to inject these dependencies using constructor as I am expecting around 20-30 of such fields.

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
558
2

Ответы 2

если эти поля вводятся исключительно для использования SomeBuilder для создания SomeImportantObject, тогда:

  • внедрить экземпляр SomeBuilder, в котором уже установлены эти поля, или
  • ввести экземпляр SomeImportantObject.

я понимаю ваше желание избежать раздувания конструктора слишком большим количеством аргументов. в этом случае я бы посмотрел, можно ли эти свойства логически сгруппировать в несколько (или один) новый тип, который вместо этого будет передан как параметры конструктора.

Зависимости могут быть реально введены только при инициализации после в случае конструктора без аргументов или инициализации в в случае конструктора с аргументами.

Это означает, что в текущем состоянии ваш код не будет работать с DI, поскольку вы хотите что-то построить при инициализации.

Конечно, здесь возникает вопрос о дизайне; это не кажется хорошей идеей, даже с DI. Предположим, что при инициализации ваш конструктор выдал исключение. Ваш объект будет в шатком частично инициализированном состоянии, и он не будет вам полностью полезен.

При этом я бы сильно посоветовал вам переместить свой конструктор из конструктора. Как только он выйдет, не имеет значения, используете вы DI или нет, и шаблон DI или (конструктор, поле или сеттер) подойдет вам.

Другие вопросы по теме