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