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

标签 java

我问的是关于“如何在 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/

相关文章:

java - 在 jooq 中设置 NULL 值

java - 简单 ListView onClick 中的按钮

java - 鼠标点击检测

java - 使用处理存储从串行连接读取的 Arduino 数据

java - 列 'column' 不能为空

java - 在 Android 中将纪元时间转换为日期并将日期转换为纪元时间

swing - java jlabel在Windows中工作,但在Linux中不工作,在屏幕上显示旧格式,openjdk?

java web 应用程序无法在 glassfish v3 上创建日志文件(使用 log4j)

java - WebApplicationInitializers 类的等效 web.xml ?

java - 在Android中创建应用程序时如何只创建一次变量?