我在遗留系统中看到了代码的公共方法,克隆对象,执行状态变异并返回对象的新副本。
这只是感觉不对,但只是想知道是否有人知道这样做的一个已知的正当理由。否则,如果有人知道一个非常糟糕的理由,你可以帮忙。
。在我提出一个重大改变之前,我只需要为这种情况提出一些争论由于
示例代码
public Class MyClass
{
public string MyProp { get; set; }
public MyClass Cancel()
{
var newObj = this.Clone();
newObj.Status = Status.Cancelled;
return newObj;
}
}
答案 0 :(得分:7)
这是具有immutable个对象的典型模式,例如Java或.Net中的String
。通过返回带有更改的新对象,对旧对象的引用不会看到状态更改。能够依赖不改变的对象可能非常有用。当然,不可变对象需要付出代价,每个状态更改都需要分配一个新实例。
正如MattDavey在对该问题的评论中指出的那样,该示例代码(假设添加了缺失的位)创建了一个包含可变实例的类,因为MyProp
& #39; s set
是公开的。因此,它似乎确保了Status
的不可变性,而不是MyProp
的不可变性,这将是相当不寻常的。对于一个实例来说,更典型的是不可变的,或者不是,但不是部分如此。我认为这是编辑问题代码的副产品,但是......