gpt4 book ai didi

java - 从对象返回嵌套集合的正确方法是什么?

转载 作者:行者123 更新时间:2023-11-29 05:30:11 25 4
gpt4 key购买 nike

假设我有以下类(class)

class Person{
long id;
List<Address> addresses;

public Person(long id){
this.id = id;
this.addresses = new ArrayList<Address>();
}

public long getId(){
return id;
}

//Implementation # 1
public List<Address> getAddresses(){
List<Address> addressesToReturn = new ArrayList<Address>();
for(Address address : addresses){
addressesToReturn.add(address.copy());
}
return addressesToReturn;
}
}


class Address{
String value;

public Address(String value){
this.value = value;
}

public Address copy(){
Address address = new Address(this.value);
return address;
}
}

在这种特殊情况下,getAddresses() 返回地址对象副本的列表。我本可以有两个替代实现,如下所示:

  //Implementation # 2
public List<Address> getAddresses(){
List<Address> addressesToReturn = new ArrayList<Address>();
for(Address address : addresses){
addressesToReturn.add(address); //i.e. return the original object as is
}
return addressesToReturn;
}

  //Implementation # 3
public List<Address> getAddresses(){
return addresses; //i.e return the original list.
}

现在,我发现我不应该使用第三个实现,因为我不想让一些外部代码更改 Person 对象的地址。

在第一个和第二个之间,我有点困惑。前两个实现中的哪一个是首选,特别是当我有某种数据存储/数据库来存储所有人员对象时?

我想知道何时使用Implementation #1 以及何时使用Implementation #2

最佳答案

一般来说,如果AddresssetValue,你应该使用Implementation #1;否则,实现 #2 将正常工作,因为您的 Address 对象是不可变的。

请注意,即使 Address 本身是可变的,您也不一定要使用更昂贵的解决方案 #1。另一种选择是将可变 Address 实例呈现为不可变接口(interface),并返回实现该接口(interface)的对象列表。这将使您避免复制单个对象:

public interface Address {
String getAddress();
}
class AddressImpl implements Address {
String address;
public AddressImpl(String address){
this.address = address;
}
public String getAddress() { return address; }
public void setAddress(String address) { this.address = address; }
}
...
public List<Address> getAddresses(){
List<Address> addressesToReturn = new ArrayList<Address>();
for(Address address : addresses){
addressesToReturn.add(address); //i.e. return the original object as is
}
return addressesToReturn;
}

关于java - 从对象返回嵌套集合的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21362411/

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