带参数的 DRY 自定义 Guice 提供程序

DRY Custom Guice Provider with parameters

我需要在不同地方注入多个 X 实例。 我实现了一个自定义 Guice 提供程序来提供 class X 的不同实例,如下所示。

public class XProvider implements Provider<X> {
    private final Factory f;
    private final String NAME = "Something String";

    @Inject
    public XProvider(Factory f) {
       this.f = f;
    }

    public X get() {
        return new X(f, NAME);
    }
}

因为我需要具有不同 NAME 值的 X 的不同实例,所以我需要多个相似的 classes 像 XProvider1、XProvider2 等,只有一个领域不同。 创建一个抽象 class 来扩展无助于减少冗余代码量,因为(1)隐藏字段不好 (2) 如果我不隐藏字段,我仍然需要在 subclass 中有构造函数。

我不能使用 Assisted Injection 因为我不拥有 X 所以我更改了它的构造函数。

必须有更好的方法来做到这一点,要么是使用 Guice 的更聪明的方法,要么是另一种方法来重构我的代码。 我在这里寻找一些改变的建议。

谢谢,

如果您预定义了一组有限的可能参数,则可以在 guice 模块中使用命名的@Provides 绑定:

@Provides @Named("Type 1") MyClass getType1() {return new MyClass("Param of type 1");}
@Provides @Named("Type 2") MyClass getType2() {return new MyClass("Param of type 2");}

然后用名字注入它

@Inject @Named("Type 1") 
private MyClass instance, anotherInstance;

ps。您可以将任何可注入参数传递给@Provides 方法,即 getType2(Factory factory) {return ...