Java:instanceof或自定义getType

时间:2012-12-17 17:12:36

标签: java instanceof

假设我有以下代码:

public boolean doesElfLikeIt ( Monster mon )
 {
    if ( mon instanceof Orc ) { return false; }
    if ( mon instanceof Elf ) { return true; }

 }

这是一种很好的编程方法,还是我应该选择这样的方式:

public boolean doesElfLikeIt ( Monster mon )
 {
    if ( mon.getType() == Orc.type ) { return false; }
    if ( mon.getType() == Elf.type ) { return true; }

 }

我之所以这样问是因为我听到很多关于instanceof比较有多邪恶的事情,但我发现它很有用。

2 个答案:

答案 0 :(得分:8)

都不是。你真正应该做的是:

class Monster {
  public abstract boolean likesElves();
}

class Orc extends Monster {
  public boolean likesElves() {
    return false;
  }
}

class Elf extends Monster {
  public boolean likesElves() {
    return true;
  }
}

答案 1 :(得分:1)

Gonzo牧师提议的解决办法违反了封闭法,并没有回答这个问题。封装被违反,因为所有怪物现在必须知道他们是否喜欢精灵,以非常间接和深层次的方式将所有怪物与特定的子类型(精灵)联系起来。它没有回答这个问题,因为兽人完全有可能喜欢精灵,但是精灵不喜欢兽人!

我觉得使用instanceof的初始解决方案完全没问题。虽然SLaks提出了一个很好的观点,但我认为种族主义精灵(精灵不喜欢兽人,所有兽人的亲戚听起来都是种族主义者;))是一个完全合法的设计决定,而不是程序员错误的指示。

要退后一步并解决“我如何让精灵像某些兽人一样?”,我认为最好的答案是“为什么他们喜欢并且不喜欢怪物,以及特定的兽人”。只要您关闭单个数据点(类型),您的行为就会受到限制。