我有以下代码:

 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);

现在,编译器将发现尚未实现此新方法的所有位置,从而帮助您避免在运行时出现问题。

10-07 18:57
查看更多