instanceof是否有害?

5

我正在查看一些代码,其中大量使用了Java的instanceof运算符。由于这是一个普遍性问题,所以我将忍住不详细讨论。 instanceof让我想起了C++的dynamic cast,并且让我回想起很久以前读到的有关它的建议,即如果您认为需要使用它,那么您的模型可能存在问题。这仍然是传统智慧吗?它适用于Java的instanceof吗?


1
个人笔记,我不急于称任何语言特性为邪恶或说它永远不应该被使用。是的,即使是 goto。我认为,当你看到某些模式时,应该引起注意,就像有很多闪烁标签的旧 Geocities 网站一样,并告诉程序员“你最好准备好为这个选择辩护”。instanceOf 的频繁出现是其中一个案例吗?还是在某些情况下非常自然? - derekv
1
我认为这就像反射一样--过度使用可能不好,并暗示需要重新设计,但有些情况下你只能使用它。 - Hovercraft Full Of Eels
2个回答

13

是的,你走在正确的道路上。虽然 instanceof 在某些情况下确实有用,但其过度使用通常意味着你的类设计存在缺陷。


1
谁给这个点了踩?这可是完全正确的答案。如果你不得不使用大量的 instanceOf,我会认为你的信息流有缺陷。通常情况下,代码的任何给定部分都不应该需要询问它正在传递的类是什么。当然也有例外情况,而且相当多。InstanceOf 在某种程度上是一种反射功能,而反射始终需要小心使用。 - markus
1
如果没有解释为什么使用instanceof表示设计缺陷,那么这个答案就是不完整的。 - Daniel Hershcovich
我参加了一门关于编程语言的课程,该课程认为使用 instanceof 不符合面向对象的原则。这是毋庸置疑的。 - Giorgio

4
在Java中,应该使用泛型来减少instanceof关键字的数量。这样只有那些在编译时不知道的才需要检查。话虽如此,instanceof并不像goto一样会很大程度地混乱你的控制流(尽管如果你不小心的话,它确实会引入许多额外的变量)。
我经常使用instanceof,但如果有很多的话,我会认为这是代码异味。关键是要想出更好的方法;如果可以的话,使用instanceof可能是错误的。我不知道一个方案来判断是否对于通用情况使用是好还是坏。在instanceof之后的强制转换可能比关键字本身更具破坏性。

1
实际上,在 equals 方法中使用 instanceof 经常是错误的,因为您可能会创建出错的 equals 方法。equals 的最佳默认值是使用 (getClass() == o.getClass())。只有在您真正需要支持所有“相等”的多个类型时才使用 instanceof。 - jtahlborn
@jtahlborn:这是一个很好的观点,可能被许多使用“instanceof”的equals()方法洗脑了。已删除答案的最后一部分。 - Maarten Bodewes
是的。不幸的是,这是默认实现,通常用作简单示例或由 IDE 生成。 - jtahlborn
@jtalborn,很有趣,但我想了解为什么getClass()比instanceOf更好。你能说服我吗? - ejaenv
@ejaenv - 很难用评论来描述它,可以查看此文章获取详尽的答案:http://www.angelikalanger.com/Articles/JavaSolutions/SecretsOfEquals/Equals.html - jtahlborn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接