【问题标题】:Encapsulation Broad theory封装广义理论
【发布时间】:2014-01-30 00:30:11
【问题描述】:

我正在学习 Java,并已来到本书的封装部分。

对于数据“隐藏”,封装的重点是保护原始变量不被程序的任何部分更改吗?

那里的设置器是否允许您仅在真正需要时才允许更改变量?就像在类本身中设置条件一样。

举个例子。我有一个“银行余额”,如果我要买东西,我想看看余额,但它还没有被“收费”,所以在收费完成之前变量不会改变,从而满足银行为真实余额设定的条件。

这是一个非常广泛的例子,我意识到我可以这样编码,我只是作为一个例子询问。

【问题讨论】:

  • 实际上,setter 在封装方面是一种不好的做法,请参阅javaworld.com/article/2073723/core-java/…
  • 嗯,他们可能是不好的做法。如果对象的“设置某某属性”的概念是合乎逻辑的,那么它们是可以的,例如“设置图形小部件的背景颜色”。如果您将其视为授予设置变量(而不是“属性”)的能力,那么它可能是错误的概念。

标签: java oop encapsulation


【解决方案1】:

区别不在于基元和对象,而在于私有和公共状态。例如,对于电视,您关心音量设置和它所在的频道,但用户不需要知道(也不应该关心)发送到放大器和 PLL 芯片的实际 I2C 命令。

封装意味着明确定义哪些项目是面向公众的,然后隐藏其余项目,以便实施者可以更改完成工作的确切方式,并且客户不能搞砸封装服务的操作。

例如,Setter 的存在是为了让对象可以控制其状态如何以及是否更新。例如,TV#setChannel() 方法可能会更改电视上的channel 字段,但它也会执行一些其他操作来更改调谐器设置的频率,可能会在屏幕上显示新频道等等.客户端代码不应该担心(或者有时甚至知道)这些。

在银行转帐的情况下,还有许多其他注意事项,因为通常必须同时进行多项操作。需要的不仅仅是对象级封装,但防止客户端代码直接弄乱余额是所需解决方案的一部分。

【讨论】:

    【解决方案2】:

    是的,它可以防止其他类直接访问您类的私有变量。

    这样想:

    与此相比:

    使用 setter(以及整个封装),您有机会实现额外的逻辑来决定如何设置变量,从而为您提供额外的控制层。您可以添加一个算法以在从账户中取款之前扣除一些费用,或者在这种情况下,进行额外检查以防止这个邪恶的类造成损害。尽管使用设计模式,但有更强大的方法来完成这些事情,但为了让您了解封装的意义,我将它们用作示例。

    封装不仅仅是关于 setter 和 getter。这是通过将实际实现隐藏在外观后面来限制对程序内部组件的控制的想法。

    【讨论】:

    • 因此,封装的目的是定义私有信息,并在需要时添加额外的条件层来改变它。此外,它将数据操作限制在类本身(私有)内。我相信另一个好处是防止 API 中的代码损坏?这是因为您不需要跟踪变量的每个实例,而是在类中更改它,并且永远不需要触及对“getter 和 setter”的各种引用?
    • 没错。在维基百科中:“一种用于限制访问某些对象组件的语言机制。”。您限制其他人篡改您班级中特定变量的使用方式。每当你这样做时,你就是在进行封装。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多