我有一个abstract class Foo
,其中包含一个函数a(Object o)
根据您使用的Foo
的实施情况,a(Object o)
的实施方式略有不同。
我希望程序的用户能够确定使用Foo
的实现(例如,aFoo
,bFoo
,cFoo
等),但是我希望减少对条件逻辑的使用,以便将来可以更安全地添加到我的程序中。
我目前有一个Enum eBar
,其中包含用户可以选择的Foo
的所有实现的名称,但我无法确定如何使用它来初始化该类。< / p>
答案 0 :(得分:4)
在每个枚举实例中存储要使用的Foo实例,或添加一个创建Foo的方法:
public enum FooType {
A {
@Override
public Foo createFoo() {
return new AFoo();
}
},
B {
@Override
public Foo createFoo() {
return new BFoo();
}
}
public abstract Foo createFoo();
}
然后,一旦用户选择了类型,您需要做的就是
selectedFooType.createFoo().a(object);
答案 1 :(得分:3)
[编辑]您可以使用下面的Enum
来实现这一目标
public enum FooType {
FOO_A(aFoo::new),
FOO_B(bFoo::new),
FOO_C(cFoo::new);
//add as much as you want here
private final Supplier<Foo> fooSupp; //the aim of using a supplier is to create a new instance each time you call the create method as mentioned in the comment.
FooType(final Supplier<Foo> fooSupp) {
this.fooSupp = fooSupp;
}
public final Foo create(){
return this.fooSupp.get();
}
}
然后你可以像这样使用它
final Foo myFoo = FooType.FOO_A.create();
myFoo.o(Object);