【问题标题】:how to avoid using instanceof? [duplicate]如何避免使用instanceof? [复制]
【发布时间】:2015-08-08 15:47:23
【问题描述】:

假设我有一些实体类层次结构,并且我有一个 util 类,该类具有一个获取上层类层次结构的方法,并且必须根据我的特定类对另一个实体类(之前的层次结构之外)进行一些更改得到 。 所以我将使用 instanceof 来查找我得到的特定对象。 但我知道 : 任何时候你发现自己在编写“如果对象是 T1 类型,则做某事,但如果它是 T2 类型,则做其他事情”形式的代码,给自己一记耳光。 那么不使用 instanceof 怎么办呢?

请注意,我不想将 util 方法放在实体类中,因为我希望用户(实现者程序员)能够实现该方法,但我不希望他们能够更改实体。

【问题讨论】:

  • 您可能会考虑让所有“候选”类派生自一个定义 getType() 方法的类或接口,可能会返回带有可能选项的枚举类型。奖励:您可以在 switch() {} 块中使用该枚举,性能更高...这种模式很常见。
  • 通过使用多态性。这就是它存在的原因。
  • 如果出于某种原因您不想使用多态性并希望同时避免使用 instanceof,那么访客模式可能有用吗?
  • 请注意,我不想将 util 方法放在实体类中,因为我希望用户(实现者程序员)能够实现该方法,但我不希望他们能够更改实体。

标签: java polymorphism overriding instanceof


【解决方案1】:

而不是这个:

// BAD:
public void doStuff(Parent p) {
    if (p instanceof Child1)
        doThis();
    else if (p instanceof Child2)
        doThat();
    else if …
}

这样做:

// GOOD:
public class Parent {
    public void doIt();
}

public class Child1 extends Parent {
    @Override
    public void doIt() { /* the contents of doThis */ }
}

public class Child2 extends Parent {
    @Override
    public void doIt() { /* the contents of doThat */  }
}

public void doStuff(Parent p) {
    p.doIt();
}

(代码可能不是 100% 正确(我的 Java 有点生疏),但我希望你明白。)

这称为多态

【讨论】:

    【解决方案2】:

    方法重载是您可能想要检查的内容。

    【讨论】:

    • 很确定 OP 没有询问基本方法覆盖。
    • @BadZen 很确定这是 OP 问题的正确解决方案,即使他们没有询问。
    • 我可能误解了,但从我读到的内容来看,OP 想要对一个类的不同实例做一些事情,所以例如他可以重载方法 doSomething(type1 obj)doSomething(type2 obj) 并添加不同的功能到不同的实例。
    猜你喜欢
    • 1970-01-01
    • 2012-04-18
    • 2022-11-15
    • 1970-01-01
    • 2012-08-13
    • 1970-01-01
    • 2011-09-03
    • 2013-03-05
    • 2020-08-30
    相关资源
    最近更新 更多