使用instanceof vs将isSomething()添加到基类

时间:2014-04-30 18:46:01

标签: java reflection instanceof

假设我有这个类层次结构:

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()”,这完全合理地给出了这个具体的例子。但是假设重点不是腿的数量,而是得到这种类型的动物。

3 个答案:

答案 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可能还有更多工作要做:

  1. 设置checkClass = this.getClass()
  2. checkClass ==目标类?如果是,请返回true。
  3. checkClass是否有超类?如果不是,则返回false。
  4. 设置checkClass = checkClass的超类
  5. 转到2
  6. (可能更多的努力涉及接口的可能性;在这种情况下,我假设JVM实现意识到目标类不是接口,并且可以使用该知识来获益。)

    但是,虚方法调用不需要潜在的迭代:从对象的vtable中获取函数指针,然后调用它。

    但是当目标类是对象的直接超类时,遍历类层次结构时只有一次迭代。这种情况比虚拟方法调用“更快”还是“更慢”?

    底线:这取决于。当表现很重要时,衡量。如果没有明确指出代码性能瓶颈的数据,则更喜欢清晰,简洁,易懂和可维护的代码。