假设我有以下课程
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
通常,如果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] 删除。
我来说两句