假设我有以下代码:
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
比较有多邪恶的事情,但我发现它很有用。
答案 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提出了一个很好的观点,但我认为种族主义精灵(精灵不喜欢兽人,所有兽人的亲戚听起来都是种族主义者;))是一个完全合法的设计决定,而不是程序员错误的指示。
要退后一步并解决“我如何让精灵像某些兽人一样?”,我认为最好的答案是“为什么他们喜欢并且不喜欢怪物,以及特定的兽人”。只要您关闭单个数据点(类型),您的行为就会受到限制。