2012-12-17 19 views
2

假设我有以下代码:的Java:的instanceof或定制的getType

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比较是多么邪恶的事情,但是我发现它很有用。

+5

你不明白为什么它是邪恶的;你的建议稍微恶化一点。你应该使用多态函数。 – SLaks

+0

出于好奇,为什么我的方法会被视为更邪恶? –

+0

如果你传递一个继承'Orc'的类? – SLaks

回答

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

牧师冈佐的建议的解决方案违反encapsolation,并没有回答这个问题。所有怪物现在必须知道他们是否喜欢精灵,并以非常间接和深入的方式将所有怪物连接到特定的子类型(精灵),因此封装被违反。它没有回答这个问题,因为兽人喜欢精灵是完全可能的,但是精灵不喜欢兽人!

我觉得你最初的解决方案使用instanceof是完全没问题的。虽然SLak提出了一个很好的观点,但我认为种族主义精灵(精灵不喜欢兽人,以及所有兽人亲属听起来相当种族主义;))是一个完全合法的设计决定,而不是程序员错误的表示。我想退一步说,“我如何拥有像一些兽人一样的精灵?”,我认为最好的答案是“模式为什么他们喜欢并且不喜欢怪兽,一般来说,怪兽和特定的兽人。只要你关闭一个数据点(类型),你总是会有一些有限的行为。