代码之家  ›  专栏  ›  技术社区  ›  unj2

如何复制对象的防御副本?

  •  3
  • unj2  · 技术社区  · 15 年前

    我如何在不可变对象中创建包含可变字段的可变对象的防御性副本?

    class ImmutableObject {
    
      private final MutableObject immutable_field;
    
      ImmutableObject(MutableObject y) {
        this.immutable_field = y;
      }
    }
    
    class MutableObject {
    
      public int mutable_field;
    }
    
    • 可变对象没有允许我设置字段的构造函数。
    • 可变对象的当前状态应在不可变对象中捕获,并且不应更改。
    2 回复  |  直到 15 年前
        1
  •  7
  •   Romain Hippeau    15 年前

    你需要做的是

      MutableObject return_immutable_field() {
        return immutable_field;
      }
    

    改为:

      MutableObject return_immutable_field() {
        MutableObject tmp = new MutableObject();
        tmp.mutable_field = immutable_field.mutable_field;
        return tmp;
      }
    

    有关解释,请参阅 http://www.javapractices.com/topic/TopicAction.do?Id=15

        2
  •  4
  •   Michael Aaron Safyan    15 年前

    好吧,假设对于可变对象类的声明没有什么要做的,我们可以利用反射( Class . newIntance() 等级 . getFields() )创建新对象并复制字段值。您也可以用这种方式实现深度复制。如果类支持序列化,那么另一种黑客方法是序列化对象,然后保存反序列化副本。不过,如果能够修复可变对象的设计,那将是一种更好的方法。

    编辑
    对于你给出的具体例子,罗曼的答案是你想要的。如果您有一个通用的可变对象,它不提供复制它的机制,并且直到稍后才知道该类型,那么反射方法就是如何实现复制机制。