我遇到了关于正确封装方式的article。它确实引起了我的注意并解决了我以前的一些困惑。然后我想到了它的实现。不得有任何属性或(getter方法)暴露任何公共引用。为了实现这一点,每个内场必须新建。但是,并不总是可以知道构造逻辑,甚至找不到合适的构造函数。所以我认为深度克隆可能会用于此目的。
有一些方法可以实现深度克隆(one way,some other ways)。
我的问题是:
1-我的方法是否有意义还是完全无稽之谈?
2-深度克隆操作是危险还是不确定?如果是,那么对于这样的核心模块(商业模式获取者)使用这种动态(或不确定)行为是否合适?
PS:即使文章中使用了Java,我也会问.NET或C#的问题。我不太确定,但Java可能具有不同的深度克隆能力。我对Java感到不舒服。
答案 0 :(得分:3)
Java和C#足够接近,其含义相同。
对我来说,这篇文章最好不要发表,因为它唯一能让人迷惑并将它们发送到像#34;我需要深入克隆界面中所有暴露的对象,这样他们才能& #39; t被改变。"
这不是封装的本质。封装的本质是这样的 - 例如 - 给定公共生日的年龄计算不会暴露:
class foo {
public DateTime Birthdate { get;set;}
public int Age { get { return (DateTime.Now - Birthdate).ToYears(); } }
}
因此,"内部运作"如何计算年龄不会暴露。或者更确切地说,该逻辑是封装的
现在,有时您可能确实希望确保暴露的对象完全不可变,但总的来说,那就是垃圾。 (深度克隆不是简单的壮举,在所有,并且本文没有足够的洞察力来解决问题的更广泛的范围,以便做任何好事。)
放弃深入克隆暴露的所有内容的想法,并且只使用其中包含的逻辑编写类,并且您将具有足够的封装以用于绝大多数目的。
OOP概念应始终采用非常健康的实用主义。