【问题标题】:Update object from list of objects without affecting original reference of object从对象列表中更新对象而不影响对象的原始引用
【发布时间】:2017-04-18 19:35:14
【问题描述】:

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

【问题讨论】:

  • 请尝试用一些代码显示您的问题;因为我真的不明白你的解释。
  • 复制一份? new ArrayList<>( previousList ) 创建一个新的 ArrayList 包含 previousList 的所有元素,但它不是同一个列表,因此对新列表的任何更改都不会影响 previousList
  • @Sunshinator new ArrayList<>( previousList ) 创建了一个新的列表实例,但是当新的列表被实例化时,其中包含的元素引用了 previousList 中包含的相同元素。因此,修改其中一个元素将反映在两个列表中。

标签: java android arraylist reference clone


【解决方案1】:

您可以使用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 暴露给类客户端。如果客户忘记复制,您的要求将得不到尊重。
因此,您可以在包含List 的类中提供自定义get() 方法,以返回所请求的MyObject 的副本。 它将产生更可靠的防御副本。

【讨论】:

    【解决方案2】:

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

    Student18 s1=new Student18(101,"amit");  
    
    Student18 s2=(Student18)s1.clone(); 
    

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

    【讨论】:

      猜你喜欢
      • 2016-11-30
      • 2016-02-21
      • 1970-01-01
      • 2015-01-23
      • 1970-01-01
      • 2017-09-18
      • 1970-01-01
      • 2012-11-24
      • 2020-08-09
      相关资源
      最近更新 更多