Java “如何处理特殊情况”;常数;使用DI时对象的实例

Java “如何处理特殊情况”;常数;使用DI时对象的实例,java,design-patterns,dependency-injection,Java,Design Patterns,Dependency Injection,我的项目大量使用依赖注入,我非常小心地避免服务定位器反模式。所有对象都是使用构造函数注入构造的,它允许容易识别的依赖项列表。现在我正在构建一个对象,它有一个特殊的“常量”实例,基本上是静态/单例的(考虑类似Integer.MinValue的示例)。因此,我最初的反应是使用静态“getter”方法创建一个静态字段,如果之前没有创建对象的实例,该方法将创建该对象的实例。然而,对象本身有依赖关系,所以我不清楚实例化这个“特殊实例”的最佳实践是什么。我正在寻找关于如何在这种情况下最好地构造代码的建议,理

我的项目大量使用依赖注入,我非常小心地避免服务定位器反模式。所有对象都是使用构造函数注入构造的,它允许容易识别的依赖项列表。现在我正在构建一个对象,它有一个特殊的“常量”实例,基本上是静态/单例的(考虑类似Integer.MinValue的示例)。因此,我最初的反应是使用静态“getter”方法创建一个静态字段,如果之前没有创建对象的实例,该方法将创建该对象的实例。然而,对象本身有依赖关系,所以我不清楚实例化这个“特殊实例”的最佳实践是什么。我正在寻找关于如何在这种情况下最好地构造代码的建议,理想情况下不必调用容器来解析依赖项。一些代码:

public class PressureUnit extends DataUnit {
    private static PressureUnit standardAtmosphere;
    public static PressureUnit StandardAtmosphere() {
        if(standardAtmosphere == null){
            standardAtmosphere = new PressureUnit(1013.25); // this line is what is bothering me as I need to resolve other dependencies (have to use new as it's a static method and can't be injected like everywhere else)
        }
        return standardAtmosphere;
    }

    @AssistedInject
    public PressureUnit(ITimeProvider timeProvider, IUnitProvider unitProvider, @Assisted double value) {
        this(timeProvider, unitProvider, value, PressureUnits.hPa);
    }
    ...
}

我真的看不出您的代码中有任何问题,因为您没有在这里或那里更新依赖项,现在我可以给出一些建议:

  • 如果特别希望容器调用现有的静态工厂方法,可以使用
  • 你为什么不用工厂呢
  • 如果可能的话,考虑重构您设计的并删除静态方法

您可以在构建DI容器时初始化静态StandardAtmosphere值,也可以将StandardAtmosphere值作为DI容器中的单例注册。我只是觉得这些常量是业务逻辑的一部分,并将它们粘贴到依赖项解析模块注册中(这是我使用的容器-guice的情况,必须在模块内的@Provides方法中)。将此放入模块感觉就像将业务逻辑放在它所属的位置之外。