“实例”“类型”这是什么用例?

时间:2011-06-10 16:29:25

标签: java

在做一些随意的阅读时,我发现了Scott Meyers的有趣引语

  

任何时候你发现自己写作   形式的代码“如果对象是   键入T1,然后执行某些操作,但是如果   这是T2型,然后做点什么   否则,“打自己。”

我只是想知道为什么当你可以通过重写方法做同样的事情时,Java有“实例”操作符?什么时候实际使用?

7 个答案:

答案 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)

它对于调试非常有用,可以检查一个对象是否实际上是你认为的对象,我打赌它还有一些用途。