gpt4 book ai didi

java - 如何创建具有可变对象作为引用的不可变类

转载 作者:搜寻专家 更新时间:2023-11-01 02:41:52 24 4
gpt4 key购买 nike

我问的是关于“如何在 java 中制作不可变对象(immutable对象)”的非常基础的问题。

所以我有一个来自第三方的 Address 类,它不继承任何 Cloneable 接口(interface)及其可变类。看起来像这样

public class Address {

private String city;
private String address;

public String getCity() {
return city;
}

public void setCity(String city) {
this.city = city;
}

public String getAddress() {
return address;
}

public void setAddress(String address) {
this.address = address;
}
}

现在我有另一个名为 Person 的不可变类,它实现了 Cloneable 接口(interface)并重写了 clone 方法。类看起来像这样

public class Person implements Cloneable {

private String name;
private Address address;

public Person() {

}

public Person(String name, Address address) {
this.name = name;
this.address = address;
//this.address = (Address) address.clone();
}

public String getName() {
return name;
}

@Override
protected Object clone() throws CloneNotSupportedException {
Person person = (Person) super.clone();
return super.clone();
}

public Address getAddress() {
return address;
}

@Override
public String toString() {
return "name:" + name + ", address" + address.getAddress() + ", city="
+ address.getCity();
}

}

现在我的问题是,我当然可以克隆 Person 类对象,但是如何克隆地址类实例。我还阅读了一些关于浅克隆和深度克隆的文章。但我无法理解使用 30 方 API 可以进行多深的克隆。如果我对克隆的理解有误,请纠正我。

最佳答案

我认为您理解得很好:clone 是一种糟糕的机制,实际上有一个完整的错误列表(查看 Effective Java)。与您的情况特别相关,您不能使用 final 字段深度克隆对象。

而是选择一种自定义机制来复制对象,例如复制构造函数或专用方法。

内存中序列化-反序列化循环也有一个技巧,但我不会真正推荐它,除非您的列表中的性能和效率不高。

关于java - 如何创建具有可变对象作为引用的不可变类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31566725/

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