假设我有这个类层次结构:
Animal <-- FourLegged <-- Dog
Animal <-- FourLegged <-- ....
Animal <-- ThreeLegged <-- ... (what has 3 legs?)
Animal <-- TwoLegged <-- Chicken
Animal <-- TwoLegged <-- ...
(忘了对于四条腿和两条腿动物的科学术语是什么。但是这不是重点,对吗?:))
如果我有Animal
个对象,我需要知道它是FourLegged
还是TwoLegged
,我通常会animalObject instanceof FourLegged
。< / p>
这比向isFourLegged()
课程添加一堆isThreeLegged()
,isTwoLegged()
,Animal
要慢吗?
(我想知道性能影响。这不是设计练习。所以如果你不浪费时间建议如何重写课程,我将不胜感激。) < / p>
修改 有些人建议添加“getNumberOfLegs()”,这完全合理地给出了这个具体的例子。但是假设重点不是腿的数量,而是得到这种类型的动物。
答案 0 :(得分:1)
如果您的子类没有添加任何行为并且只是指定腿数的方法,那么您应该使用名为替换子类与字段的this refactoring。 =&GT;不再需要子类。
否则,添加一个多态方法,例如:numberOfLegs()
,由您的每个Animal
子类实现。
答案 1 :(得分:0)
尝试
Animal animal = new Dog();
if(animal.getClass().isAssignableFrom(FourLegged.class)){
System.out.println("FourLegged");
}
为他人做同样的事情
答案 2 :(得分:0)
问题围绕执行的“速度”:比另一种慢一点吗?
除非您在谈论算法差异,否则唯一能够远程了解性能的方法是衡量您的预期用例。在Java中,许多变量会影响性能,包括所选的JVM,JVM参数等。
话虽如此,很容易看出instanceof
可能还有更多工作要做:
(可能更多的努力涉及接口的可能性;在这种情况下,我假设JVM实现意识到目标类不是接口,并且可以使用该知识来获益。)
但是,虚方法调用不需要潜在的迭代:从对象的vtable中获取函数指针,然后调用它。
但是当目标类是对象的直接超类时,遍历类层次结构时只有一次迭代。这种情况比虚拟方法调用“更快”还是“更慢”?
底线:这取决于。当表现很重要时,衡量。如果没有明确指出代码性能瓶颈的数据,则更喜欢清晰,简洁,易懂和可维护的代码。