被认为是不好的做法吗?如果是这样,在什么情况下仍然更可取?

aio*_*obe 62 java instanceof

多年来,我尽力避免instanceof.在适用的地方使用多态或访问者模式.我认为在某些情况下它只是简化了维护...是否还有其他一些应该注意的缺点?

但我确实在Java库中看到它,所以我认为它有它的位置?在什么情况下更可取?难道不可避免吗?

Ale*_*yak 22

它肯定在股票实施中占有一席之地equals.例如

public boolean equals ( Object o )
{
  if ( this == o )
  {
     return true;
  }

  if ( ! (o instanceof MyClass) )
  {
    return false;
  }

  // Compare fields
  ...
}
Run Code Online (Sandbox Code Playgroud)

关于instanceof的一个巧妙的事情就是它的LHS可以null在那种情况下表达式求值false.

  • 我发现在equals()中使用"instanceof"是可以接受的,因为它不可能扩展一个可实例化的类并添加一个方面(例如,一个新的字段),同时保留equals()契约(特别是对称性和传递性).请参阅Bloch的"Effective Java". (7认同)
  • 我更喜欢`getClass()== o.getClass()`.否则,即使"帕格"不等于"狗","狗"也可能意外地等于"帕格".如果这个类是最终的`instanceof`当然可以正常工作,但无论如何它都等同于类比较. (7认同)

Dan*_*olz 13

我认为当你绝对需要知道对象的类型时,instanceof是最好的选择.

一个不好的做法是拥有很多instanceofs,一个紧挨着另一个,并根据他们调用对象的不同方法(当然是铸造).这可能反映出层次结构需要重新思考并可能重构.


Phi*_*Lho 11

我可以想象一些情况,例如你有一些库的对象,你无法扩展(或者这样做不方便),也许与你的一些对象混合,所有对象都具有相同的基类,在一起采集.
我想在这种情况下,使用instanceof来区分对这些对象的某些处理可能是有用的.

想象遗留代码的一些维护,你不能在很多旧类中注入一些新的行为只是为了添加一个新的小功能或一些错误修复...

  • 我认为一般来说,在处理您无法控制的API或库时,instanceof最有用. (7认同)
  • 好的,由于遗留代码。很公平。尽管如此,感觉像以前没有完全通过设计决策来使用 instanceof“修复”。 (2认同)

elj*_*nso 5

当你在一个纯粹的OO模型里面,那instanceof肯定是代码味道.

但是,如果你不使用100%的面向对象的模型或者你需要注入的东西把它从外面,然后的instanceof或等价物(isXXX(),getType(),...)可以有用武之地.

一般的"规则"是尽可能避免它,特别是当控制类型层次结构并且可以使用子类型多态性时.我们的想法不是要询问对象是什么类型并使用它做某事,而是通过访问者(基本上是双重多态)直接或间接地询问对象来执行某些操作.