Есть ли способ использовать введенные поля внутри конструктора по умолчанию? Ниже псевдокод -
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.
если эти поля вводятся исключительно для использования SomeBuilder
для создания SomeImportantObject
, тогда:
SomeBuilder
, в котором уже установлены эти поля, илиSomeImportantObject
.я понимаю ваше желание избежать раздувания конструктора слишком большим количеством аргументов. в этом случае я бы посмотрел, можно ли эти свойства логически сгруппировать в несколько (или один) новый тип, который вместо этого будет передан как параметры конструктора.
Зависимости могут быть реально введены только при инициализации после в случае конструктора без аргументов или инициализации в в случае конструктора с аргументами.
Это означает, что в текущем состоянии ваш код не будет работать с DI, поскольку вы хотите что-то построить при инициализации.
Конечно, здесь возникает вопрос о дизайне; это не кажется хорошей идеей, даже с DI. Предположим, что при инициализации ваш конструктор выдал исключение. Ваш объект будет в шатком частично инициализированном состоянии, и он не будет вам полностью полезен.
При этом я бы сильно посоветовал вам переместить свой конструктор из конструктора. Как только он выйдет, не имеет значения, используете вы DI или нет, и шаблон DI или (конструктор, поле или сеттер) подойдет вам.