java - 类型变量 vs instanceof 用于识别

标签 java instanceof

我有两个类是抽象类 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);
}

或者添加一个 enumA 不同的类型:

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

最佳答案

两者都不好。

A 中定义方法,覆盖 XY 中的方法,并在传入的对象上调用该方法。你是抛弃面向对象编程的基石多态性。

abstract class A {
    void doStuff();
}

class Y extends A {
    @Override
    void doStuff() {
        // Y specific implementation
    }
}

class X extends A {
    @Override
    void doStuff() {
        // X specific implementation
    }
}

调用它使用

void myfunction(A myobj) {
    myobj.doStuff();
}

关于java - 类型变量 vs instanceof 用于识别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27715131/

相关文章:

java - 更改 Java 数据类型的问题

java - OSGI 类加载和对象共享

java - 如何以编程方式将事件添加到 Outlook 日历或 Google 日历?

java - instanceof 似乎不起作用 - 我的代码有什么问题?

java - instanceof 如何在接口(interface)上工作

java - 如何区分父类(super class)数组中的不同子类?

java - 将 int 转换为 String 的最有效方法是什么?

java - JAVA语言的缩写是什么?

java - 检查两个类是否具有相同的父类(super class)

scala - 匹配有状态子类对象时,我可以避免在模式匹配中使用 asInstanceOf 吗?