一般来说,避免instanceof使用的一个很好的解决方案是使用所谓的访问者模式。
对于这种模式,您需要一个额外的接口(访问者)、一个包含您想要执行的代码的实现以及层次结构的所有类中的一个额外的方法,所以在小情况下这可能是多余的(但它非常如果不仅有Aand B,而且还有更多类型,则很方便)。
在您的情况下,它看起来像这样:
interface Visitor {
void visit(A a);
void visit(B b);
}
class Base {
abstract accept(Visitor v);
}
class A extends Base {
accept(Visitor v) {
v.visit(this);
}
}
class B extends Base {
accept(Visitor v) {
v.visit(this);
}
}
class MyVisitor implements Visitor {
visit(A a) {
doSomethingWithA(a);
}
visit(B b) {
doSomethingWithB(b);
}
}
它是这样使用的:
MyVisitor v = new MyVisitor();
while(iterator.hasNext()) {
Base next = iterator.next();
next.accept(v);
}
一个优点是您只需编写大部分代码一次。如果你想在程序的另一个地方用 A 和 B 做其他事情,只需编写另一个访问者的实现。您不需要修改Base,就像添加这些类A一样。BdoSomething()
编辑:
如果子类的数量增加,您需要更改所有现有的Visitor. 但是,至少编译器会告诉您这一点。instanceof您最终可能会忘记需要添加处理子句的地方。这最多可以在运行时检测到,而访问者模式为您提供编译时安全性。