对象上的方法是否应返回该对象的新副本

时间:2013-07-01 07:19:58

标签: oop

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

这只是感觉不对,但只是想知道是否有人知道这样做的一个已知的正当理由。否则,如果有人知道一个非常糟糕的理由,你可以帮忙。

。在我提出一个重大改变之前,我只需要为这种情况提出一些争论

由于

示例代码

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

1 个答案:

答案 0 :(得分:7)

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


正如MattDavey在对该问题的评论中指出的那样,该示例代码(假设添加了缺失的位)创建了一个包含可变实例的类,因为MyProp& #39; s set是公开的。因此,它似乎确保了Status的不可变性,而不是MyProp的不可变性,这将是相当不寻常的。对于一个实例来说,更典型的是不可变的,或者不是,但不是部分如此。我认为这是编辑问题代码的副产品,但是......