gpt4 book ai didi

java - 这种方法适合返回列表的副本吗?

转载 作者:行者123 更新时间:2023-12-02 07:27:58 24 4
gpt4 key购买 nike

我有这个问题。我有两个层次结构,一个是 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 作为新列表的副本。这在 hte RAM 区域中是一个痛苦,因为我的 GUI 框架在创建页面时收到此列表(我正在使用 Wicket BTW)。假设有 10, 000 个用户访问该页面。因此该方法将创建 10, 000 个副本列表。最糟糕!如果他们只是刷新页面也会发生这种情况。我不想返回原始列表,因为我不想让客户端将猫添加到 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
}

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

关于java - 这种方法适合返回列表的副本吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13297651/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com