我在项目中有一个同事,他强烈反对使用 instanceof
运算符,因为它会“产生很多开销”,这是为什么呢?这是真的吗?
除了使用 instanceof
,还有其他方法可以检查对象的类型吗?
因为在某些情况下,我发现它非常有用。
我在项目中有一个同事,他强烈反对使用 instanceof
运算符,因为它会“产生很多开销”,这是为什么呢?这是真的吗?
除了使用 instanceof
,还有其他方法可以检查对象的类型吗?
因为在某些情况下,我发现它非常有用。
它确实会产生一些开销,再加上后续的强制类型转换。在最新版本的Java中,这种开销已经减少了。但无论如何,这只是微小优化——也就是说,在一般情况下,您不必担心它。
instanceof
的真正争议点是,在许多情况下,有更好的面向对象编程方式来实现所需的行为。
如果编译器可以证明实例,则可能不会产生任何开销。即使编译器无法立即证明目标,开销也非常小。几个 CPU 时钟(特别是如果 instanceof 跳转被正确预测)。
instanceof 后的以下强制类型转换通常是免费的。
(注意:我指的是 JIT 编译器)
instanceof
操作符可能只需要一个CPU时钟周期这么廉价。 - bestsssinstanceof
返回true和对此类型的强制转换成功并不完全等价 - 后者可能在前者返回false时成功。因此,即使有这样的情况,String s = someMethodReturningString();
Object o = s;
if (o instanceof String) {
...
}
编译器在这里必须生成至少一个检查o!= null
。
实际上,这是可以忽略不计的。
(o instanceof String)
将被省略。我试图解释一下:在性能方面,人们真正应该考虑的唯一操作是访问内存,其他操作都已经得到了很好的优化。 - bestsss没有太大的开销。它几乎肯定比自己编写一个类似于getType()的解决方案更便宜。转换虽然不是免费的,但也非常便宜。
正如Bozho所指出的那样,这可能意味着设计有缺陷,但在某些情况下,它是最实用的选择,因此不应该被轻易忽略。
instanceof
后就变成了免费。 - bestsss主要问题在于它会产生代码异味。如果使用多态性,这是更好的设计方法。性能成本可能在10到100纳秒之间,具体取决于调用的复杂性以及从该行代码调用了多少实现方法。