我有以下代码:
public class A {
private String type;
String getType() { return type;}
}
现在在很多代码地方,我都有这样的代码
switch (a.geType()) {
case "A" : return new Bla();
case "B" : return new Cop();
}
或者别的地方
switch (a.geType()) {
case "A" : return new Coda();
case "B" : return new Man();
}
(请注意,我知道我应该在生产代码中使用枚举)。
我要实现的是,当将新类型添加到类A时,编译器应标记所有需要调整的switch语句?
有没有Java惯用的方式来做到这一点?
最佳答案
一个好的方法是用更可靠的多重分派(dispatch)实现替换switch
语句,例如Visitor Pattern:
interface VisitorOfA {
Object visitA(A a);
Object visitB(B b);
}
class A {
Object accept(VisitorOfA visitor) {
return visitor.visitA(this);
}
}
class B extends A {
Object accept(VisitorOfA visitor) {
return visitor.visitB(this);
}
}
有了这个基础架构,您可以删除
switch
语句,将其替换为访问者的实现:Object res = a.accept(new VisitorOfA() {
public Object visitA(A a) { return new Bla(); }
public Object visitB(B b) { return new Cop(); }
});
当您向
A
添加一个新的子类型(例如class C
)时,您要做的就是向VisitorOfA
添加一个新方法:Object visitC(C c);
现在,编译器将发现尚未实现此新方法的所有位置,从而帮助您避免在运行时出现问题。