Java 这种做法被认为是不好的做法吗?如果是,在什么情况下instanceof仍然更可取?
多年来,我一直在尽可能避免出现Java 这种做法被认为是不好的做法吗?如果是,在什么情况下instanceof仍然更可取?,java,instanceof,Java,Instanceof,多年来,我一直在尽可能避免出现instanceof。在适用的情况下使用多态性或访问者模式。我想它只是在某些情况下简化了维护。。。还有其他的缺点需要注意吗 但是,我确实在Java库中看到了它,所以我想它有它的位置吗?在什么情况下更可取?这是不可避免的吗?我认为,当你绝对需要知道对象的类型时,instanceof是最好的选择 一个不好的做法是有大量的实例,一个挨着另一个,并根据它们调用对象的不同方法(当然是强制转换)。 这可能反映出层次结构需要重新思考,也可能需要重构。我认为当你绝对需要知道对象的类
instanceof
。在适用的情况下使用多态性或访问者模式。我想它只是在某些情况下简化了维护。。。还有其他的缺点需要注意吗
但是,我确实在Java库中看到了它,所以我想它有它的位置吗?在什么情况下更可取?这是不可避免的吗?我认为,当你绝对需要知道对象的类型时,
instanceof
是最好的选择
一个不好的做法是有大量的实例,一个挨着另一个,并根据它们调用对象的不同方法(当然是强制转换)。
这可能反映出层次结构需要重新思考,也可能需要重构。我认为当你绝对需要知道对象的类型时,instanceof
是最好的选择
一个不好的做法是有大量的实例,一个挨着另一个,并根据它们调用对象的不同方法(当然是强制转换)。
这可能反映出层次结构需要重新思考,也可能需要重构。它可以很好地用作铸造前的健全性检查;除了检查对象的类型是否正确外,它还检查对象是否为null
if (o instanceof MyThing) {
((MyThing) o).doSomething(); // This is now guaranteed to work.
} else {
// Do something else, but don't crash onto ClassCast- or NullPointerException.
}
它可以很好地用作铸造前的卫生检查;除了检查对象的类型是否正确外,它还检查对象是否为null
if (o instanceof MyThing) {
((MyThing) o).doSomething(); // This is now guaranteed to work.
} else {
// Do something else, but don't crash onto ClassCast- or NullPointerException.
}
我可以想象一些情况,例如,您有一些无法扩展的库对象(或者这样做会很不方便),可能与您的一些对象混合在一起,所有对象都具有相同的基类。在一个集合中。
我想在这种情况下,使用instanceof来区分这些对象上的某些处理可能会很有用
在一些遗留代码的维护中,您不能在许多旧类中注入一些新行为,只是为了添加一个新的小功能或一些bug修复…我可以想象一些情况,例如,您有一个库的一些对象,您无法扩展(或者这样做会很不方便),可能与您的一些对象混合在一起,都具有相同的基类,一起组成一个集合。
我想在这种情况下,使用instanceof来区分这些对象上的某些处理可能会很有用
在一些遗留代码的维护中,你不能仅仅为了添加一个新的小功能或一些错误修复而在很多旧类中注入一些新行为…当你在一个纯OO模型中时,那么instanceof
肯定是一种代码味道
但是,如果您没有使用100%的OO模型,或者需要从外部向其中注入内容,那么instanceof或等效的(isXXX()
,getType()
,…)就可以使用它
一般的“规则”是尽可能避免它,特别是当您控制类型层次结构并且可以使用子类型多态性时。其思想不是询问对象是什么类型并对其进行处理,而是通过访问者(本质上是双重多态性)直接或间接地询问对象以执行某些操作。当您处于纯OO模型中时,instanceof
肯定是一种代码气味
但是,如果您没有使用100%的OO模型,或者需要从外部向其中注入内容,那么instanceof或等效的(isXXX()
,getType()
,…)就可以使用它
一般的“规则”是尽可能避免它,特别是当您控制类型层次结构并且可以使用子类型多态性时。其思想不是询问对象是什么类型并对其进行处理,而是通过访问者(本质上是双重多态性)直接或间接地询问对象以执行某些操作。它肯定在equals
的库存实现中占有一席之地。例如
public boolean equals ( Object o )
{
if ( this == o )
{
return true;
}
if ( ! (o instanceof MyClass) )
{
return false;
}
// Compare fields
...
}
关于instanceof,需要知道的一点是,它的LHS可以是null
,在这种情况下,表达式的计算结果为false
它肯定在equals
的股票实现中占有一席之地。例如
public boolean equals ( Object o )
{
if ( this == o )
{
return true;
}
if ( ! (o instanceof MyClass) )
{
return false;
}
// Compare fields
...
}
关于instanceof,需要知道的一点是,它的LHS可以是null
,在这种情况下,表达式的计算结果为false
,我同意它可能有异味。很多情况下,特别是在一个锁在一起,如果块,气味不好
有时它的行为方式可能是你意想不到的。。。我曾经发生过一件事:
Class B extends A
Class C extends A
B b = new B();
C c = new C();
b instanceof B -> true
b instanceof C -> true
c instanceof C -> true
c instanceof B -> true
(在我的例子中,这是因为hibernate制作代理对象……但在instanceof上执行代码dpend是有风险的)我同意它可能有一股难闻的气味。很多情况下,特别是在一个锁在一起,如果块,气味不好
有时它的行为方式可能是你意想不到的。。。我曾经发生过一件事:
Class B extends A
Class C extends A
B b = new B();
C c = new C();
b instanceof B -> true
b instanceof C -> true
c instanceof C -> true
c instanceof B -> true
(在我的例子中,这是因为hibernate制作代理对象……但这只是在instanceof上执行代码dpend有风险的情况)在创建工厂的情况下如何?
e、 g
如果是创作工厂呢?
e、 g
我很清楚它的作用。我想说的是,你的例子展示了一种不好的instanceof实践。我可能想使用多态性消除这个条件,正如在equals(Object o)中所描述的@aioobe(您不知道:)那么,这个链接中的示例(除了过于复杂)容易发生简单的空指针崩溃。比起花哨的词语,我更喜欢简单而健壮的解决方案。我非常清楚它的作用。我想说的是,你的例子展示了一种不好的instanceof实践。我可能想消除这种使用多态性的条件,正如在equals(Object o)中所描述的@aioobe,你不知道:)那么,这个链接中的示例(除了过于复杂之外)容易出现