使用instanceof检查特定的子类是否是一种好的设计实践?

时间:2018-08-18 21:34:19

标签: java design-patterns

所以我有一个基类Item。从Item扩展了两个类;武器和盔甲。尽管“武器”和“护甲”具有物品的一些属性,例如名称和稀有度,但它们各自也具有特定于它们的属性,例如,对武器的伤害和对盔甲的防御。

我想将所有Item对象都放在同一列表中,所以我将所有Weapon和Armor对象上载到Item对象,然后将它们添加到列表中。要访问武器或盔甲特有的属性,我只需检查Item对象是否是武器或盔甲的实例并相应地向下转换。

所以我的问题是:
这是好的设计习惯吗?
如果没有,您可以推荐更好的解决我的问题吗?
自从我自己弄清楚该信息以来,就一直找不到在线信息。

1 个答案:

答案 0 :(得分:2)

这样做没有错。在Java中,这只是实现所需内容的唯一方法。某些具有更复杂类型系统的语言可能会有更干净的解决方案,但最终总是需要检查实际实例属于哪个类。

编辑:

我写的并不着急,所以让我对此进行更多说明。当我们拥有某种通用类型的容器时,经常会遇到这种情况,并且在某些情况下,我们需要对其中的某些元素执行一些特定于类的操作。

现在有2种可能的解决方案,首先是将它们分成2个容器并失去该抽象级别,另一种是您所使用的,具有更多的抽象容器,但是当您需要使用较低级别的类来简单地检查时它对应于哪种类型。

根据情况,其中一种可能会比另一种更好,如果您必须在大多数使用该容器的地方使用instanceof,则表明您应该使用2个不同的容器,每个容器具有特定的类。另一方面,如果您只需要在1或2个地方使用instanceof,则应该这样做。