【发布时间】:2014-12-31 01:44:33
【问题描述】:
我有两个类是抽象类A的子类:
class X extends A {}
class Y extends A {}
我想确定传递给函数的A 对象的子类。我可以看到两种选择:
void myfunction(A myobj) {
if(myobj instanceof X)
doXStuff((X) myobj);
if(myobj instanceof Y)
doYStuff((Y) myobj);
}
或将 enum 添加到具有不同类型的 A:
abstract class A {
enum Type { X, Y };
Type type;
...
}
class X extends A {
type = Type.X;
...
}
class Y extends A {
type = Type.Y;
...
}
void myfunction(A myobj) {
if(myobj.type == Type.X)
doXStuff((X) myobj);
if(myobj.type == Type.Y)
doYStuff((Y) myobj);
}
哪个更好?我倾向于第二个,因为instanceof 感觉不适合生产应用程序。还有另一种最好的方法吗?如果第二个更好,有没有更好的地方放enum?
【问题讨论】:
-
两者都不是更好。对于 90% 的情况,如果您需要获取接口并确定具体的类,然后才能进行专门的逻辑,那么您的设计是错误的。
-
肯定有支持和反对使用
instanceof的论据。但看在上帝的份上,如果你需要像instanceof这样的东西,不要重新发明轮子。如果您不能以 Jeroen 的回答风格使用多态性,那么您的第一个解决方案比您的第二个解决方案要好得多(对不起,阿德里安)。
标签: java instanceof