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();
}