簡體   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