0

この質問があります。私には2つの階層があります。1つはAnimalで、もう1つは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
}
}

AnimalStoreでメソッド転送を使用するListクラスのメソッドがいくつかあります。別のリストを作成し、動物からの取得とnewListへの設定を繰り返すリストを取得する方法があります。次に、newListを新しいリストのコピーとして返します。私のGUIフレームワークはページの作成時にこのリストを受け取るため(Wicket BTWを使用しています)、これはRAMゾーンの問題です。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 に答える