0

我有这个问题。我有两个层次结构,一个是 Animal,另一个是 AnimalStore。

public abstract class Animal{
//Some members
}

public class Dog extends Animal{
//Some members
}

public abstract class AnimalStore{
//Some members
private List<Animal> animals;
public abstract void addAnimal(Animal a);
//Methods forwarding some List methods
//remove, find, count, 
}
public Animal get(int n){
return animals.get(n);
}
//Method for returning a copy of the list.


public class DogStore extends AnimalStore{
//some memebers
public void addAnimal(Animal a){
//Assert is a dog because this is a Dogs Store
}
}

我有一些 List 类的方法,使用 AnimalStore 中的方法转发。我有一种获取列表的方法,我在其中创建另一个列表并迭代从动物获取并设置为 newList。然后我将 newList 作为新列表的副本返回。这在内存区域很痛苦,因为我的 GUI 框架在创建页面时会收到此列表(我使用 Wicket BTW)。假设有 10,000 个用户访问该页面。因此该方法将创建 10, 000 个副本列表。最糟糕的!如果他们只是刷新页面也会发生。我不想返回原始列表,因为我不想客户端将猫添加到 DogStore 的动物列表中。

4

1 回答 1

2

您可以使用模板强制执行更严格的编译类型检查:

public abstract class AnimalStore<T extends Animal> {
    //Some members
    private List<T> animals;

    public abstract void addAnimal(T a);

    //Methods forwarding some List methods
    //remove, find, count, 

    public T get(final int n) {
        return animals.get(n);
    }
}

//Method for returning a copy of the list.

public class DogStore extends AnimalStore<Dog> {
    //some memebers
    @Override
    public void addAnimal(final Dog a) {
        //Assert is a dog because this is a Dogs Store
    }
}

public abstract class Animal {
    //Some members
}

public class Dog extends Animal {
    //Some members
}

以这种方式编写,您删除了必须创建副本的要求,因为我不想客户端将猫添加到 DogStore 的动物列表中

于 2012-11-08T21:08:31.080 回答