3

假设我有:

public class FightingZone<MobileSuitso, Background> {

    private MobileSuitCollection<MobileSuitso> msCollection;
    private BackgroundInfo<Background> bgInfo;

    public FightingZone(MobileSuitCollection<MobileSuitso> newCollection, BackgroundInfo<Background> newInfo) {
        this.msCollection = newCollection;
        this.bgInfo = newInfo;
    }

    ...

        ...// inside a method
        MobileSuitCollection temporaryCollection = new MobileSuitCollection<MobileSuitso>(); // /!\

}

问题是 MobileSuitCollection 是一个接口,所以我无法实例化它。例如,我可以这样做:

MobileSuitCollection temporaryCollection = new GundamMeisterCollection<MobileSuitso>();
MobileSuitCollection temporaryCollection = new InnovatorCollection<MobileSuitso>();
MobileSuitCollection temporaryCollection = new CannonFolderCollection<MobileSuitso>();

等等。但是,要操作temporaryCollection,我需要它与通过参数传递给我的类的类型相同。所以我想这样做:

if (msCollection instanceof GundamMeisterCollection) {
    ...
} else if (msCollection instanceof InnovatorCollection) {
    ...
} ...

然而,我意识到这很糟糕。有一个更好的方法吗?是否可以保留对初始类型使用的类的引用,然后用它实例化temporaryCollection

4

2 回答 2

2

您放在 if 子句中的代码可以放在Visitor

// Generics skipped for brevity
interface MobileSuitCollectionVisitor {
   handleCollection(GundamMeisterCollection collection);
   handleCollection(InnovatorCollection collection);
   handleCollection(CannonFolderCollection collection)
}

class ConcreteVisitor implements MobileSuitCollectionVisitor { 
    // place all of the logic in the implemented methods
}

然后让我们MobileSuitCollection有一个方法:

void visit(MobileSuitCollectionVisitor visitor);

并且在每个实现中都MobileSuitCollection简单地拥有

public void visit(MobileSuitCollectionVisitor visitor) {
    visitor.handleCollection(this);
}
于 2010-06-29T21:15:18.797 回答
0

一种快速而肮脏的方法是克隆原始集合,然后根据需要对其进行操作。更好的方法可能是向newInstance()接口添加方法,或将工厂传递给FightingZone.

于 2010-06-29T21:21:52.963 回答