繁体   English   中英

避免Java实例

[英]Avoiding instanceof Java

我试图找到一种方法来绕开instanceof的使用。 我创建了一个类Item,其中包含多个子类,例如WeaponItem和BodyItem。 现在,我想进行一个诸如equip(Item)的调用,它应该自行确定应该调用哪个重载函数,例如equip(BodyItem)。

在这种情况下,有没有一种方法可以绕开instanceof的使用,您会建议什么? 我听说在大多数情况下,使用instanceof是不好的做法,因此,我想知道替代方法是什么。

码:

inv.equip(it); // inv = inventory object, it = Item

库存类中的Equip函数示例,我希望如何使用它

public void equip(HelmItem it) 
{
    if (it != this.getHelm())
    {
        this.setHelm(it);
    }
}

我以前怎么过的:

public void equip(Item it)
{
    if (it instanceof WeaponItem)
    {
        if (it != this.getWeapon())
        {
            this.setWeapon((WeaponItem) it);
        } 
    } etc for all subclasses of item
}

确实,这可以通过访客模式解决。

但是,它不一定是成熟的访客,而是它的简化版本。 您可以将库存传递给物料,然后让物料用它做任何想做的事情:

abstract class Item {
    public abstract void equip(Inventory inv);
}

class HelmItem extends Item {
    @Override
    public void equip(Inventory inv) {
        inv.setHelm(this);
    }
}

class WeaponItem extends Item {
    @Override
    public void equip(Inventory inv) {
        inv.setWeapon(this);
    }
}

然后,您可以致电:

it.equip(inv)

没有instanceof运算子。

为什么不将方法放在Item具体类中,并且它可以自我装备? 这有点反常,但可以解决您的问题。

public class SomeConcreteItem extends Item {
    public void equip(Body body) {
        // Just an example.
        body.getSections().get(0).equip(this);
    }
}

这样,具体的实现就知道如何装备自己,而使用它的类则不在乎。 您可以通过Item超类引用它,并提供Item超类具有抽象方法的方法public void equip(Body body); ,那么您永远不需要了解具体的实现,因此也不需要instanceof运算符。

设计模式介绍

您在引入设计模式时应该小心。 当确实可以使用更简单且(在我看来)更优雅的东西时,人们习惯直接跳到复杂的模式来解决问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM