从对象列表更新对象,而不影响对象的原始引用

时间:2017-04-18 19:35:14

标签: java android arraylist reference clone

场景是,我有一个像ArrayList<MyObject>这样的对象列表。当我修改列表的成员(项目/ Myobject)时,它会更改列表中所选对象的原始引用。如何处理这种情况使原始参考  object(MyObject)保持不变。

2 个答案:

答案 0 :(得分:2)

您可以使用clone()方法,但它有一些重要的限制。所以我不建议这样做 另一种方法是通过从新创建的实例中的原始实例复制状态来创建MyObject的新实例。

您可以在MyObject中添加一个以MyObject对象作为参数的工厂方法:

public MyObject(String message){
     this.message = message;
}

public static MyObject copy(MyObject original){
     MyObject copy = new MyObject(original.getMessage());
     return copy;
}

你可以做类似的事情来复制实例:

List<User> myObjects = new ArrayList<>();
myObjects.add(new MyObject("hello msg"));
MyObject copyObject = MyObject.copy(myObjects.get(0));

现在,如果您想要保护修改,List MyObject中包含的元素,我认为您不应该将List公开给类客户端。如果客户忘记复印,则不符合您的要求 因此,您可以在包含get()的类中提供自定义List方法,以返回所请求的MyObject的副本。 它会产生更可靠的防御性副本。

答案 1 :(得分:0)

您可以使用克隆来解决您的问题, 只需克隆它然后更改为原始对象,因此旧对象引用将在克隆对象中可用。

Student18 s1=new Student18(101,"amit");  

Student18 s2=(Student18)s1.clone(); 

现在您可以在s1中进行更改,旧的对象数据将在s2中。