输入变量vs instanceof进行标识

Dia*_*ees 5 java instanceof

我有两个类,它们是抽象类的子类A:

class X extends A {}
class Y extends A {}
Run Code Online (Sandbox Code Playgroud)

我想识别A传递给函数的对象的子类.我可以看到两种选择:

void myfunction(A myobj) {
    if(myobj instanceof X)
        doXStuff((X) myobj);
    if(myobj instanceof Y)
        doYStuff((Y) myobj);
}
Run Code Online (Sandbox Code Playgroud)

或添加不同类型的enumto 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);
}
Run Code Online (Sandbox Code Playgroud)

哪个更好?我倾向于第二,因为instanceof生产应用感觉不对.还有另一个最好的方法吗?如果第二个更好,有没有更好的地方放enum

Jer*_*vel 8

两者都很糟糕.

定义方法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
    }
}
Run Code Online (Sandbox Code Playgroud)

用它来称呼它

void myfunction(A myobj) {
    myobj.doStuff();
}
Run Code Online (Sandbox Code Playgroud)

  • @pbabcdefp:'A`已经是OP指示的一个类,所以我不打算改变它,因为它可能还有更多.我不知道它是应该是基于抽象示例的类还是接口.我会给你*编程*. (2认同)