1

我在我们的遗留系统中看到代码,其中类的公共方法、克隆对象、执行状态突变并返回对象的新副本。

只是感觉不对,但只是想知道是否有人知道这样做的已知充分理由。否则,如果有人知道这样做的一个非常糟糕的理由,你可以帮忙。在我提出重大改变之前,我只需要为这种情况提出一些论据。

谢谢

示例代码

public Class MyClass
{
   public string MyProp { get; set; }
   public MyClass Cancel()
   {
        var newObj = this.Clone();
        newObj.Status = Status.Cancelled;
        return newObj;
   }
}
4

1 回答 1

7

这是具有不可变对象的典型模式,例如String在 Java 或 .Net 中。通过返回带有更改的新对象,对旧对象的引用不会看到状态更改。能够依赖一个不改变的对象是非常有用的。当然,不可变对象是有代价的,每次状态更改都需要分配一个新实例。


正如MattDavey在对该问题的评论中指出的那样,该示例代码(假设添加了缺失的位)创建了一个具有可变实例的类,因为MyProp'sset是公共的。因此,它似乎确保了 的不变性,Status但不能确保MyProp,这将是相当不寻常的。一个实例是不可变的或不是不可变的,但不是部分不可变是更典型的。我认为这是编辑问题代码的副产品,不过......

于 2013-07-01T07:23:25.360 回答