在做一些随意的阅读时,我发现了Scott Meyers的有趣引语
任何时候你发现自己写作 形式的代码“如果对象是 键入T1,然后执行某些操作,但是如果 这是T2型,然后做点什么 否则,“打自己。”
我只是想知道为什么当你可以通过重写方法做同样的事情时,Java有“实例”操作符?什么时候实际使用?
答案 0 :(得分:3)
有时您必须使用您无法控制其行为(例如源代码)的对象,因此您无法始终依赖面向对象的解决方案来处理与类型相关的问题。 (特别是考虑到图书馆的作者无法预测您可能拥有的每个用例;当然,您可以认为扩展和实现提供了解决方法,但它们比直接类型检查需要更多的努力。)
“instanceof”运算符为您提供了一种检查对象类型并有条件地执行操作的方法。
答案 1 :(得分:1)
避免它是理想的,但有时是必要的。
使用instanceof可能会干扰开放/封闭原则(" O"在SOLID中)。如果您实现了instanceof测试,那么在创建新的实现类时可能需要修改您的类。
然而,有时是必要的。例如,它可以用于Object.equals()
方法的实现。参数是一个Object - 因此该方法可以被任意子类覆盖 - 但是您通常需要将它强制转换为类的类型进行比较。
答案 2 :(得分:1)
当我使用第三方库时,我确实使用它,而且课程是最终的(混蛋!)。
代码中的if-type-do-something表示do-something应该是在类或接口中定义的具有覆盖行为的方法。但这假设您控制实施。有时你没有。
答案 3 :(得分:1)
当我为某个班级equals()
实施Foo
时,它通常看起来像这样:
public boolean equals(Object o) {
if (o instanceof Foo) {
Foo that = (Foo) o;
[ compare this to that ]
} else {
return false;
}
由于我覆盖了equals
,签名被强加给我,但我需要知道我是否有一个Foo实例进行有意义的比较。
答案 4 :(得分:0)
例如:
public void eat(Eatable eatable){
if(eatable instanceof fruit){
//direct eat
}
}
class Eatable {
}
class Fruit extends Eatable {
}
答案 5 :(得分:0)
在编写Wrapper设计模式中的复杂类结构时,你永远不会知道你会遇到什么样的对象。在这种情况下,您使用operator的实例检查对象。
答案 6 :(得分:-1)
它对于调试非常有用,可以检查一个对象是否实际上是你认为的对象,我打赌它还有一些用途。