多年来,我尽力避免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
.
Dan*_*olz 13
我认为当你绝对需要知道对象的类型时,instanceof
是最好的选择.
一个不好的做法是拥有很多instanceof
s,一个紧挨着另一个,并根据他们调用对象的不同方法(当然是铸造).这可能反映出层次结构需要重新思考并可能重构.
Phi*_*Lho 11
我可以想象一些情况,例如你有一些库的对象,你无法扩展(或者这样做不方便),也许与你的一些对象混合,所有对象都具有相同的基类,在一起采集.
我想在这种情况下,使用instanceof来区分对这些对象的某些处理可能是有用的.
想象遗留代码的一些维护,你不能在很多旧类中注入一些新的行为只是为了添加一个新的小功能或一些错误修复...
当你在一个纯粹的OO模型里面,那instanceof
肯定是代码味道.
但是,如果你不使用100%的面向对象的模型或者你需要注入的东西把它从外面,然后的instanceof或等价物(isXXX()
,getType()
,...)可以有用武之地.
一般的"规则"是尽可能避免它,特别是当您控制类型层次结构并且可以使用子类型多态性时.我们的想法不是要询问对象是什么类型并使用它做某事,而是通过访问者(基本上是双重多态)直接或间接地询问对象来执行某些操作.