Java 在单例对象中克隆某些内容
也许我只是停电了,但我找不到一个可行的方法来解决我的问题 我有一个Java 在单例对象中克隆某些内容,java,singleton,Java,Singleton,也许我只是停电了,但我找不到一个可行的方法来解决我的问题 我有一个Class a的单例对象,其中包含一个ArrayList。在C类中,我需要数组列表的特定项(克隆它)。虽然ArrayList应该保持不变,但我需要对Class C中的项进行一些修改。我尝试在类项中实现Cloneable,如下所示: 公共类项实现可克隆{ private ArrayList mSize=new ArrayList(); 受保护对象克隆()引发CloneNotSupportedException{ 返回super.cl
Class a
的单例对象,其中包含一个ArrayList
。在C类
中,我需要数组列表
的特定项
(克隆它)。虽然ArrayList
应该保持不变,但我需要对Class C
中的项
进行一些修改。我尝试在类项中实现Cloneable,如下所示:
公共类项实现可克隆{
private ArrayList mSize=new ArrayList();
受保护对象克隆()引发CloneNotSupportedException{
返回super.clone();
}
public void modifySomething(){
mSize.clear();
}
}
之后我想得到项目
,如下所示:
C类{
void foo(){
Item=null;
试一试{
item=(item)A.getInstance().getItems().get(0.clone();
item.modifySomething();
}捕获(CloneNotSupportedException e){
e、 printStackTrace();
}
}
}
问题在于,项也会在singleton对象中被修改。
Q:我是否采取了错误的方法?如何获得所需的行为?发生的是,克隆它不是“深度”克隆,您仍然有相同的引用:
private ArrayList<String> mSize = new ArrayList<>();
在这里:
这基本上是一个“无操作”。它不会将列表中的内容神奇地复制到新列表中。只是为了记录:对于任何方法,重写都是毫无意义的,但是只调用超级方法实现。然后你也可以:只是不要覆盖那个方法
因此,要么使用不同的机制,要么用自定义内容覆盖该方法,以创建新列表。否则,您的克隆和原始项对象将在同一个列表实例上运行。非常感谢MVCE。在这一点上,我们不知道哪里有陷阱Object.clone()
返回一个浅拷贝,因此可能与此有关?也许您可以发布一个包含modifysomething
实际功能的日志。如果Item
包含可变对象,则您的clone()
方法可能过于简单。还要注意的是,这与单例或列表无关。当尝试编写这个最小的示例时,请只关注以下内容:您有一个带有clone()方法的类,并且操作一个克隆对象,从而改变原始对象。这是你问题的核心所在,其他任何事情都是噪音,只是无缘无故地增加了复杂性。@Robby Cornelissen@khelwood:添加了一些额外的代码,希望这能澄清我的观点。是,项
包含可变对象@幽灵猫谢谢你的提示。正如我所说,我有点困惑。是的,这是一个肤浅的复制问题。您必须显式克隆ArrayList
。此外,将项更改为implements Serializable。这是apache中的库:
item = (Item) SerializationUtils.clone(A.getInstance().getItems().get(0));
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}