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

use*_*892 1 oop

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

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

谢谢

示例代码

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

T.J*_*der 7

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


作为MattDavey在关于这个问题的评论指出,该示例代码(假设加在失位),创建一个类可变的情况下,因为MyPropset是公众.所以它似乎确保了Status不可靠性,但不是MyProp,这将是相当不寻常的.对于一个实例来说,更典型的是不可变的,或者不是,但不是部分的.我认为这是编辑问题代码的副产品,但是......