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

安奇

假设我有以下课程

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对象的地址。

在第一和第二之间,我有点困惑。前两个实现中的哪一个更可取,特别是当我将使用某种数据库/数据库来存储所有person对象时?

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

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

通常,如果Address具有has setValue,则应使用实现#1;否则,因为您的Address对象是不可变的,所以实现2可以正常工作

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

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;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

用fetch解构嵌套json对象的正确方法是什么?

让成员函数返回类型成为要返回的实际对象的超类的正确方法是什么?

从嵌套组件返回映射迭代器的正确方法是什么?

用几个对象建立索引的正确集合是什么?

Nestjs-创建DTO文件以转换嵌套json对象的正确方法是什么?

从函数返回的正确方法是什么?

遍历对象的正确方法是什么?

引用自身对象的正确方法是什么

使用NgRx,重置或返回状态对象内部的空数组的正确方法是什么?

检查集合是否存在的正确方法是什么?

循环遍历 HTML 集合的正确方法是什么

返回集合集合的语法是什么?

减少和合并对象集合的最佳方法是什么

在graphql中嵌套数据的正确方法是什么?

在Twig中迭代嵌套数组的正确方法是什么

使用Firebase监听嵌套更改的正确方法是什么?

使用Swift解析嵌套JSON数据的正确方法是什么?

引用嵌套参数扩展的正确方法是什么?

在 pytransitions 中使用嵌套状态的正确方法是什么?

键入接收对象并更新属性的方法的正确方法是什么?

UnusedNullCheckInEquals :通过 equals 方法比较对象的正确方法是什么?

POST 嵌套对象的非输入数据的最佳方法是什么?

包含嵌套对象的 setState 的最佳方法是什么

为什么可观察的集合返回正确数量的对象,但对象为空?

正确的方法是什么?

将日期作为特定格式的字符串传递并使用 momentjs 返回日期对象的正确方法是什么?

从FFI返回的片中创建OsStr(ing)的正确方法是什么?

使用c ++ 11线程返回结果的正确方法是什么?

从灯具返回结构化数据的正确方法是什么?