设A是具有方法a的接口。 设B是一个实现A的类,有方法a,有三个字段1,2,3。 我想使用A的两个实例(意思是B),它们在两个不同的地方都有不同的1,2,3值(存在于cfg文件中)。
有人可以使用Guice为这个问题提供一个简单而优雅的解决方案。
答案 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);
}