Java Guice-在构造函数内部使用注入字段

Java Guice-在构造函数内部使用注入字段,java,dependency-injection,guice,Java,Dependency Injection,Guice,有没有一种方法可以在默认构造函数中使用注入字段?下面是伪代码- public class SomeClass() { @Inject private SomeField someField; @Inject private SomeOtherField someOtherField; private SomeImportantObject someImportantObject; public SomeClass() { SomeBuilder

有没有一种方法可以在默认构造函数中使用注入字段?下面是伪代码-

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)
原因:java.lang.NullPointerException
在com.something.something.SomeClass.(SomeClass.java:10)
现在我明白了这是因为在注入依赖项之前调用了默认构造函数

但是,以前有没有办法注入依赖项?
或者,有没有更好的方法

注意,我不想使用构造函数注入这些依赖项,因为我预计大约有20-30个这样的字段


如果注入这些字段纯粹是为了让
SomeBuilder
生成
SomeImportantObject
,那么:

  • 插入已设置了这些字段的
    SomeBuilder
    实例,或
  • 注入
    SomeImportantObject
    的实例

我理解您希望避免使用太多参数使构造函数膨胀的愿望。在这种情况下,我想看看这些属性是否可以逻辑地分组为几个(或单个)新类型,而不是作为构造函数参数传递。

如果这些字段被注入纯粹是为了被
SomeBuilder
用来生成
SomeImportantToObject
,那么:

  • 插入已设置了这些字段的
    SomeBuilder
    实例,或
  • 注入
    SomeImportantObject
    的实例

我理解您希望避免使用太多参数使构造函数膨胀的愿望。在本例中,我将查看这些属性是否可以在逻辑上分组为几个(或单个)新类型,而不是作为构造函数参数传递。

对于无参数构造函数,依赖关系只能在初始化后实际注入,对于带参数的构造函数,依赖关系只能在初始化时注入

这意味着,在当前状态下,您的代码将无法与DI一起工作,因为您希望在初始化时构建一些东西

当然,这就引出了设计的问题;即使使用DI,这似乎也不是一个好主意。假设在初始化时,构建器抛出了一个异常。您的对象将处于不稳定的部分初始化状态,并且它对您不会完全有用


有鉴于此,我强烈地鼓励您将构建器移出构建器。一旦退出,那么不管您是否使用DI,DI模式(构造函数、字段或setter)都可以为您工作。

只有在无参数构造函数初始化后,或者在带参数的构造函数初始化时,才能实际注入依赖项

这意味着,在当前状态下,您的代码将无法与DI一起工作,因为您希望在初始化时构建一些东西

当然,这就引出了设计的问题;即使使用DI,这似乎也不是一个好主意。假设在初始化时,构建器抛出了一个异常。您的对象将处于不稳定的部分初始化状态,并且它对您不会完全有用

有鉴于此,我强烈地鼓励您将构建器移出构建器。一旦它出来了,不管您是否使用DI,DI模式(构造函数、字段或setter)都适合您