【问题标题】:Type variable vs instanceof for identification类型变量 vs instanceof 用于识别
【发布时间】: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


【解决方案1】:

两者都不好。

定义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();
}

【讨论】:

  • @pbabcdefp: A 已经是 OP 所指示的类,所以考虑到可能还有更多内容,我不会更改它。我不知道它应该是基于抽象示例的类还是接口。不过我会给你prograpping
  • 这非常有帮助。我什至没有考虑过以你的方式去做。
【解决方案2】:

简短的回答是:“两者都不好”。

就实现而言,这可能是一个不错的解决方案,但我认为就设计而言,这不是一个不错的解决方案。

特别是,它违反了单一责任原则。你把外星人代码放到类XY中,但是这个代码属于Client,它使用了XY

还有一点是你需要在这两种情况下都使用强制转换。

do_stuff(Object generic_data){((cast_so_special_class)generic_data).do_something_spcial_class_specific();}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 2016-08-25
    • 1970-01-01
    • 2021-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多