Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 这种方法可以返回列表的副本吗?_Java - Fatal编程技术网

Java 这种方法可以返回列表的副本吗?

Java 这种方法可以返回列表的副本吗?,java,Java,我有这个问题。我有两个等级,一个是动物,另一个是动物商店 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(Anima

我有这个问题。我有两个等级,一个是动物,另一个是动物商店

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
}
}
公共抽象类动物{
//一些成员
}
公家犬{
//一些成员
}
公共抽象类动物商店{
//一些成员
私人动物名录;
公开摘要动物(动物a);
//方法转发一些列表方法
//移走,找到,数,
}
公共动物获取(int n){
返回动物。获取(n);
}
//方法返回列表的副本。
公共类DogStore扩展了AnimalStore{
//一些成员
公共动物(动物a){
//他是一只狗,因为这是一家狗店
}
}

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

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

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
}
公共抽象类AnimalStore{
//一些成员
私人动物名录;
动物公共文摘(TA);
//方法转发一些列表方法
//移走,找到,数,
公共T获取(最终整数n){
返回动物。获取(n);
}
}
//方法返回列表的副本。
公共类DogStore扩展了AnimalStore{
//一些成员
@凌驾
公共动物(最终狗a){
//他是一只狗,因为这是一家狗店
}
}
公共抽象类动物{
//一些成员
}
公家犬{
//一些成员
}

这样写的话,你就不需要创建副本了,因为我不想客户端将猫添加到DogStore的动物列表中。

如果你使用的是java 5或更高版本,请阅读泛型。这正是我要开始键入的内容,幸好我先阅读了答案+1这样写的话,你就不需要创建一个副本,因为我不想客户将猫添加到动物的狗店列表中。添加动物可能只是动物。添加(a);可以在基类中实现,而不是在每个派生类中实现。