0

我正在使用 2 个常见的包,ImmutablesGuice。在运行时发生的第一件事是我将环境和其他来源的设置加载到一个单例、非不可变的配置类中,我们称之为它MyConfig,例如,公开一个公共getSettingX()方法。

 MyConfig myConfig = MyConfig.intialize().create();  
 String settingX = myConfig.getSettingX();

我有一个抽象的不可变类,称之为AbstractImmutable。在实例化时需要设置一个基于myConfig.getSettingX().

@Value.Immutable
abstract class AbstractImmutable {
   abstract String getSettingX(); // Ideally set 
}

现在,通常我MyConfig使用 Guice 注入到类中,并且想找到一种方法来实现类的实现(以避免每次构建对象时都AbstractImmutable必须手动注入类——整个原因是使用果汁开始,MyConfig管理我的 DI)。但是,由于具体的 Immutables 类是在编译时生成的,因此它不适用于通常的 Guice 注入注解。

Immutables 站点上有使用 builder 包注释静态工厂方法的指示,但我似乎无法弄清楚如何将其添加到抽象不可变类中。

有人有什么建议吗?

4

1 回答 1

1

据我所知,没有办法在生成的 Immutables 类本身上执行此操作(尽管您可能会做一些有趣的事情@InjectAnnotation),所以您可能不走运。

即使您以 Guice 的名义提出问题,但您提出的问题让我想起了AutoFactory使用的模式,并且应该同样适用。本质上,通过注入工厂来利用工厂模式,然后工厂将创建不可变对象。

例如,具体提到你的情况,

@Value.Immutable
abstract class ValueObject {
    MyConfig getMyConfig();

    @Value.Derived
    String getSettingX() {
        getMyConfig().getSettingX();
    }

    String getAnotherProperty();

    class ValueObjectFactory {
        @Inject MyConfig myConfig;

        ValueObject create(String anotherProperty) {
            return ImmutableValueObject.builder()
                .setMyConfig(this.myConfig)
                .setAnotherProperty(anotherProperty)
                .build();
        }
    }
}

然后,在应用程序代码中,您将ValueObjectFactory直接注入并在其上调用 create

class SomeApplicationClass {
    @Inject ValueObjectFactory factory;

    void someMethod() {
        ValueObject = factory.create("myString");

        // ... do something with the ValueObject
    }
}

同样,您可以将您的工厂定义为构建器,但这将是您必须根据您拥有的参数数量做出的决定。

于 2019-04-23T21:01:15.430 回答