instanceof运算符是否会产生大量开销? 为什么?

我的项目中有一位同事,他非常反对使用instanceof运算符,因为它“产生了很多开销”,原因是什么? 这是真的吗?

有没有其他方法来检查对象的类型而不是使用它?

因为我觉得它在某些场合非常有用。

它确实产生了一些开销,并与后续的铸造相结合。 随着最新版本的Java,开销减少了。 但无论如何,这是微观优化 – 即在一般情况下你不应该担心它。

反对instanceof的真正论据是,在许多情况下,有更好的OOP方法来实现所需的行为。

如果编译器可以certificate实例,它可能会或可能不会产生任何开销。 即使编译器无法立即certificate目标,开销也很小。 一些cpu时钟(特别是如果正确预测了instanceof jump)。

在instanceof之后的演员通常是免费的。

(注意:编译器是指JIT一个)

没有严重的开销。 它几乎肯定比本土的getType()风格解决方案便宜。 铸造虽然不是免费的,但也非常便宜。

正如Bozho所指出的,它可能表明设计存在缺陷,但在某些情况下,它是最实用的选择,所以不应该被忽视。

主要问题是它产生代码味道。 如果你使用多态,那么这是一种更好的设计方法。 性能成本可能在10到100纳秒之间,具体取决于调用的复杂程度以及从该行代码调用的实现方法数量。

实际上, instanceof返回true并且对此类型的强制转换成功并不完全等效 – 当前者返回false时后者可能成功。 所以,即使有这样的事情,

 String s = someMethodReturningString(); Object o = s; if (o instanceof String) { ... } 

编译器必须在这里生成至少一个检查o != null

但在实践中,它是可以忽略的。