封装广义理论

时间:2014-01-30 00:30:11

标签: java oop encapsulation

我正在学习Java并且已经进入了本书的封装部分。

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

那里的设置者是否允许您只在真正需要时允许变量?就像在班级中设置条件一样。

举个例子。我有一个“银行余额”,我希望看到余额,如果我要买东西,但它尚未“收费”,所以变量将不会改变,直到收费完成后,因此满足银行会为真正的平衡设定条件。

这是一个非常广泛的例子,我意识到我可以用这种方式编码,我只想问一个例子。

2 个答案:

答案 0 :(得分:2)

原语和对象之间的区别不在于私有和公共 state 之间。例如,对于电视,您关心音量设置及其所在的通道,但用户无需知道(也不应关心)发送到放大器和PLL芯片的实际I2C命令。

封装意味着明确定义哪些项目是面向公众的,然后隐藏其余项目,以便实施者可以更改工作完成的确切方式,以便客户端无法搞砸封装服务的操作。 / p> 例如,存在Setter,因此对象可以控制其状态如何以及是否更新。例如,方法TV#setChannel()可能会更改电视上的channel字段,但它也会执行一些其他操作来更改调谐器设置的频率,可能会显示新频道屏幕等。客户端代码不应该担心(有时甚至不知道)任何一个。

在银行转帐的情况下,还有许多其他考虑因素,因为多个操作通常必须同时发生。不仅需要对象级封装,还要防止客户端代码直接搞乱余额,这是所需解决方案的一部分。

答案 1 :(得分:0)

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

这样想:

enter image description here

与此相比:

enter image description here

使用setter(和封装作为一个整体),您有机会实现额外的逻辑来决定如何设置变量,为您提供额外的控制层。您可以添加算法以在从帐户中取款之前扣除一些费用,或者在这种情况下,执行额外检查以防止此恶意类别造成损害。虽然使用设计模式,但有更多可靠的方法来完成这些工作,但是为了了解封装是如何理解的,我将它们作为示例使用。

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