如何为接口的实现创建多个实例?

时间:2017-03-30 16:56:32

标签: java guice

设A是具有方法a的接口。 设B是一个实现A的类,有方法a,有三个字段1,2,3。 我想使用A的两个实例(意思是B),它们在两个不同的地方都有不同的1,2,3值(存在于cfg文件中)。

有人可以使用Guice为这个问题提供一个简单而优雅的解决方案。

2 个答案:

答案 0 :(得分:2)

您不会告诉使用您的依赖项的类如何引用该接口。我假设您想通过接口引用它。

您可以使用的是注释,它将表示您要使用的实例。假设这些是您的实现:

interface A {
    void a();
}

class B implements A {
    private int value;

    void a() { ... }

    B(int value) { this.value = value; }
}

这些是使用这些实现的类:

class UserFirst {

    private A a;

    @Inject
    UserFirst(@Named("first") A a) { this.a = a; }
}

class UserSecond {

    private A a;

    @Inject
    UserSecond(@Named("second") A a) { this.a = a; }
}

决定注入哪个实现的是@Named注释。您也可以定义注释,但通常它是一种过度杀伤。

现在,为了绑定它,你可以这样做:

class MyModule extends AbstractModule {
    @Override
    protected void configure() {

    A first = new B(1);
    B second = new B(2);


    bind(A.class)
        .annotatedWith(Names.named("first")).toInstance(first);

    bind(A.class)
        .annotatedWith(Names.named("second")).toInstance(second);
    }
}

这里有完整的文档:https://github.com/google/guice/wiki/BindingAnnotations

答案 1 :(得分:1)

如果我理解正确,你可能想要使B抽象,以便你可以覆盖你想要改变的方法,如果是这样的话。

现在我只能假设字段是指字段变量。然后我会建议你使它们成为非静态的,并在你创建一个对象时在构造函数中更改它们。然后在public static void main方法中读取1,2,3的值,并在创建新对象时发送它们:

public class B implements A {
    private int x,y,z;

    /**
    * This would now be the constructror
    */
    public B(int x, int y, int z){
        this.x = x;
        this.y = y;
        this.z = z;
    }

    /**
    * Then some return functions
    */
    public get1() { return this.x; }
    public get2() { return this.y; }
    public get3() { return this.z; }

    /**
    * Then whatever methods you get from A
    */
    public int someMethodFromA(int x, int y){
        return x*y;
    }
}


public static void main(String[] args) {
    /**
    * Some random method to read inn from CFG file
    */

    int x1 = readXFromCFG();
    int y1 = readYFromCFG();
    int z1 = readZFromCFG();

    B objectB1 = new B(x1,y1,z1);

    int x2 = readXFromCFG();
    int y2 = readYFromCFG();
    int z2 = readZFromCFG();

    B objectB2 = new B(x2,y2,z2);

    int x3 = readXFromCFG();
    int y3 = readYFromCFG();
    int z3 = readZFromCFG();

    B objectB3 = new B(x3,y3,z3);
}