我的项目中有一位同事,他非常反对使用instanceof
运营商,因为它“产生了大量开销”,原因是什么?这是真的吗?
有没有其他方法来检查Object的类型而不是使用它?
因为我发现它在某些场合非常有用。
答案 0 :(得分:13)
它会产生一些开销,并与后续的投射相结合。随着最新版本的Java,开销减少了。但无论如何,这是微观优化 - 即在一般情况下你不应该担心它。
反对instanceof
的真正论据是,在许多情况下,有更好的OOP方法来实现所期望的行为。
答案 1 :(得分:3)
如果编译器可以证明实例,它可能会或可能不会产生任何开销。 即使编译器无法立即证明目标,开销也很小。一些cpu时钟(特别是如果正确预测了instanceof跳转)。
在instanceof之后的演员表通常是免费的。
(注意:编译器是指JIT一个)
答案 2 :(得分:2)
没有严重的开销。它几乎肯定比本土的getType()风格解决方案便宜。铸造虽然不是免费的,但也非常便宜。
正如Bozho所指出的那样,它可能表明设计有缺陷,但在某些情况下它是最实用的选择,所以不应该被忽视。
答案 3 :(得分:2)
主要问题是它会产生代码味道。如果你使用多态,那么这是一种更好的设计方法。性能成本可能在10到100纳秒之间,具体取决于调用的复杂程度以及从该行代码调用的实现方法数量。
答案 4 :(得分:0)
实际上,instanceof
返回true并且此类型的强制转换成功并不完全等效 - 后者可能会在前者返回false时成功。所以,即使有这样的事情,
String s = someMethodReturningString();
Object o = s;
if (o instanceof String) {
...
}
编译器必须在此处生成至少一个支票o != null
。
在实践中,它是可以忽略的。