为什么不是';有没有一种简单的方法可以在Java中复制对象?
我的GUI中有一个类时间线。我有一个功能,我想复制这个时间线,并修改其中的数据,而我的GUI中的时间线不会受到影响 我搜索了一些论坛,还没有找到一个简单的方法,因为Java让引用保持不变。为什么没有一个简单的方法来创建一个新的对象(时间线),它没有对前一个对象的引用为什么不是';有没有一种简单的方法可以在Java中复制对象?,java,inheritance,object,reference,copy,Java,Inheritance,Object,Reference,Copy,我的GUI中有一个类时间线。我有一个功能,我想复制这个时间线,并修改其中的数据,而我的GUI中的时间线不会受到影响 我搜索了一些论坛,还没有找到一个简单的方法,因为Java让引用保持不变。为什么没有一个简单的方法来创建一个新的对象(时间线),它没有对前一个对象的引用 请帮助我制作此时间线对象的副本 如果要复制对象,请使用 如果我误解了您的问题,请评论如果您想复制对象,请使用 如果我误解了你的问题,请评论你正在寻找的方法。(我已经反复提到要引用哪些文档,那就是维基百科,它的处理更彻底。当然,那些文
请帮助我制作此时间线对象的副本 如果要复制对象,请使用
如果我误解了您的问题,请评论如果您想复制对象,请使用 如果我误解了你的问题,请评论你正在寻找的方法。(我已经反复提到要引用哪些文档,那就是维基百科,它的处理更彻底。当然,那些文档更正式) 例如 你在寻找方法。(我已经反复提到要引用哪些文档,那就是维基百科,它的处理更彻底。当然,那些文档更正式) 例如
在Java中,使用运算符“=”只是将引用复制到对象。如果要实现按值复制,请使用克隆操作(类对象的clone()方法)或实现自己的克隆方法(覆盖已实现的方法)
请注意,如果您的类在其中存储了其他对象,那么这些对象最终也应该被克隆(深度复制) 在Java中,使用运算符“=”只是将引用复制到对象。如果要实现按值复制,请使用克隆操作(类对象的clone()方法)或实现自己的克隆方法(覆盖已实现的方法) 请注意,如果您的类在其中存储了其他对象,那么这些对象最终也应该被克隆(深度复制) 此处其他作者建议的方法和接口是在错误的假设下创建的,即使用通用复制方法是个好主意。默认实现对当前对象进行浅克隆,但您可以覆盖它以进行深克隆 没有正确、通用的方法来复制任意对象,您要复制的内容取决于所涉及的对象。例如,不可变对象永远不需要复制(那只是浪费空间),而某些类型的对象无法复制(例如,如何复制
FileOutputStream
)
我发现最优雅的方式是不可变对象,其方法返回的副本仅更改了一个字段:
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支持(尽管可能有插件)。与此相关的是Josh Bloch在《有效Java》中推荐的方法。其他作者建议的方法和接口是在错误的假设下创建的,即使用通用复制方法是一个好主意。默认实现对当前对象进行浅克隆,但您可以覆盖它以进行深克隆
没有正确、通用的方法来复制任意对象,您要复制的内容取决于所涉及的对象。例如,不可变对象永远不需要复制(那只是浪费空间),而某些类型的对象无法复制(例如,如何复制FileOutputStream
)
我发现最优雅的方式是不可变对象,其方法返回的副本仅更改了一个字段:
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支持(尽管可能有插件)。与此相关的是Josh Bloch在有效java中的推荐。而不是<代码>克隆()/Cube >您可能想考虑为类编写一个复制构造函数:
public TimeLine(TimeLine original) {
this.foo = original.foo;
this.bar = original.bar;
}
复制类中任何引用字段的值时要小心。确定是否需要浅拷贝或深拷贝。而不是<代码>克隆()/代码>,您可能需要考虑为类编写一个复制构造函数:
public TimeLine(TimeLine original) {
this.foo = original.foo;
this.bar = original.bar;
}
复制类中任何引用字段的值时要小心。确定您是想要浅拷贝还是深拷贝。相关:这是一个简单的只拷贝要求,还是您在面临问题时有其他问题?相关:这是一个简单的只拷贝要求,还是您在面临问题时有其他问题?不,您是对的,虽然我尝试过让TimeLine实现可克隆并添加了方法:public Object clone()。。。。当我试图创建这个.timeline=(timeline)timeline.clone()时,我得到了nullpointerexception.public Object clone()抛出CloneNotSupportedException{return super.clone();}请不要,如果你想进行深度复制,你必须覆盖clone方法并自己实现它。如果我不实现该方法,那么我该怎么做。clone()?不,你是对的,尽管我已经尝试使TimeLine实现可克隆并添加了方法:public Object clone()。。。。当我试图创建这个.timeline=(timeline)timeline.clone()时,我得到了nullpointerexception.public Object clone()抛出CloneNotSupportedException{return super.clone();}请不要,如果你想进行深度复制,你必须覆盖clone方法并自己实现它。如果我不实现该方法,那么我该怎么做。clone()?谢谢,为什么我在使用它时会得到NullPointerException?@cwallenpoole:clone的实现像深度克隆操作一样吗?我的意思是,它会自动在MyObject中存储的所有对象上调用clone吗?@0verboze默认情况下它是浅层的,(我添加了到Wikipedia的链接,并提供了一些详细信息)谢谢,为什么我在使用它时会得到NullPointerException?@cWallenPole:克隆的实现是否像深度克隆操作一样?我的意思是,它会自动在MyObject中存储的所有对象上调用clone吗?@0verboze默认情况下它是浅层的(我添加了Wikipedia的链接,并提供了更多信息)T