java - 为什么没有一种简单的方法可以在 Java 中复制对象?

标签 java inheritance object reference copy

我的 GUI 中有一个类 TimeLine。我有一个函数,我想复制这个 TimeLine 并修改其中的数据,而我的 GUI 中的 TImeLine 不会受到影响。

我搜索了一些论坛,但没有找到简单的方法,因为 Java 让引用保持不变。为什么没有一种简单的方法来创建没有引用前一个对象的新对象 (TimeLine)?

请帮我复制这个 TimeLine 对象!

最佳答案

clone()方法和Cloneable其他作者在这里建议的接口(interface)是在错误的假设下创建的,即拥有一个通用的复制方法是个好主意。默认实现对当前对象进行浅克隆,但您可以覆盖它以进行深克隆。

复制任意对象没有正确、通用的方法,要复​​制的内容取决于所涉及的对象。例如,不可变对象(immutable对象)永远不需要复制(那只会浪费空间),而某些类型的对象不能被复制(你如何复制一个FileOutputStream,例如?)。

我发现最优雅的方式是不可变对象(immutable对象),其方法返回一个副本,仅更改一个字段:

class Pony {
    private final String name;
    private final Color color;
    private final int tailLength;

    // constructors and accessors omitted

    Pony withName(String newName) {
        return new Pony(newName, color, tailLength);
    }

    Pony withColor(Color newColor) {
        return new Pony(name, newColor, tailLength);
    }

    Pony withTailLength(String newTailLength) {
        return new Pony(name, color, newTailLength);
    }
}

// Usage:

Pony tony = new Pony("Tony", Color.DAPPLE, 32);
Pony maurice = tony.withName("Maurice") // Maurice is like Tony, but black.
                   .withColor(Color.BLACK);

不幸的是,您通过这种方式获得了很多样板,而且也没有主流 IDE 支持(尽管可能有插件)。与此相关的是 Builder pattern由 Josh Bloch 在 Effective Java 中推荐。

关于java - 为什么没有一种简单的方法可以在 Java 中复制对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7025242/

相关文章:

java - 调试时遇到问题 - 空集

Java:回文,没有获得最大数

Java 对象引用任务

java转换错误:[Ljava. lang.Byte;与[B

java - top -H -p <JVMprocessid> 给出了什么? java线程数?

inheritance - 类图转换为关系模型;继承和匹配表

javascript - `this` 内部 React 组件生命周期 Hook 的范围问题

c++ - C++ IDE Netbeans 或 Eclipse 不支持类继承吗?

javascript - 从 api 解释 JSON 的最佳方法是什么?

javascript - 未捕获的类型错误 : Object #<object> has no method 'method'