我的 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/