PSR*_*PSR 19 java encapsulation
我尝试了解很多次,但我没理解这一点.
封装是一种将类中的字段设为私有并通过公共方法提供对字段的访问的技术.如果某个字段被声明为私有,则该类之外的任何人都无法访问该字段,从而将该字段隐藏在该类中.
我们如何通过setter方法更改字段的值?我们如何防止直接访问字段?封装的真正用途是什么?
npi*_*nti 28
假设你有一个age房产.
用户可以输入的值-10虽然是有效数字,但是无效年龄.setter方法可以有逻辑,允许你捕获这些东西.
另一种情况是,拥有该age字段,但隐藏它.你也可以有一个出生日期字段,在它的setter你会有这样的东西:
...
private int age
private Date dob
...
public void setDateOfBirth(Date dob)
{
this.dob = dob;
age = ... //some logic to calculate the age from the Date of Birth.
}
Run Code Online (Sandbox Code Playgroud)
Uch*_*Dim 18
在我阅读"面向对象编程语言中的封装和继承"一书以及解释封装重要性的网站之前,我也一直很困惑.实际上,我是从网站上导演的.
人们总是说封装是"隐藏信息",因此可能使封装集中在安全性上作为主要用途.是的,你在实践中隐藏信息,但这不应该是定义,因为它可能会让人感到困惑.
封装只是"通过定义严格的外部接口来最小化单独编写的模块之间的相互依赖性"(引自本书).也就是说,当我构建一个模块时,我想要我的客户和我之间就如何访问我的模块签订严格的合同.原因在于,我可以改善内部运作而不影响我的客户,生活,应用或他们使用我的模块的任何事情.因为他们的"模块"并不完全取决于我的模块的内部工作方式,而是依赖于"外部接口",所以我可以使用它们.
因此,如果我没有为我的客户端提供一个setter并让他们直接访问变量,我意识到我需要在我的客户端使用它之前对变量设置一些限制,我改变它,可能是我,改变我客户的生命,或我的客户申请巨额费用.但如果我通过创建一个"严格的外部接口"即setter来提供"严格的合同",那么我可以很容易地改变我的内部工作,而不需要花费任何费用给我的客户.
在二传的情况(使用封装),如果真的发生了,当你设置一个变量,而我回一条消息,告知您已分配,现在我可以通过我的"接口"发送邮件,通知新的我的客户我的模块必须与之交互的方式,即"你不能分配负数",即如果我的客户试图分配负数.但是,如果我没有使用的封装,并给了一个变量我的客户端直接访问,我做我的变化,这可能会导致一个崩溃的系统,因为,如果我实施限制,是,你不能保存底片和我的客户我总是能够存储负面信息,我的客户手中会有一个崩溃的系统(如果那个"崩溃的系统"是一个银行系统,想象会发生什么).
因此,封装更多的是减少模块之间的依赖性,因此可以"安静地"进行改进,而与其交互的其他模块的费用很少或没有,而不是安全性.因为交互模块依赖于"严格的外部接口或严格的合同".
我希望这能恰当地解释它.如果没有,你可以去下面的链接并自己阅读.
您并没有完全阻止对字段的访问 - 您正在控制其他人访问某些字段的方式.例如,您可以向setter方法添加验证,或者也可以在调用字段的setter方法时更新其他一些依赖字段.
您可以阻止对该字段的写入或读取访问(例如,仅分别提供getter或setter) - 但是使用属性进行封装可以让您做更多的事情.
封装背后的主要思想是数据隐藏。我们在面向对象编程中使用封装有几个原因。我们封装的一些已确定的原因如下(封装的实际用途)。
更好的可维护性:当所有的属性都是私有的并且被封装后,我们只需改变方法就可以很容易地维护程序。
Make Debugging Easy:这与上面的观点是一致的。我们知道,对象只能通过方法来操作。因此,这使得调试和捕获错误变得容易。
拥有受控环境:让用户通过对象以受控方式使用给定的对象。
隐藏复杂性:隐藏与用户无关的复杂性。有时,某些属性和方法仅供内部使用,用户不必了解这些。这使得用户可以简单地使用该对象。
因此,为了回答“当我能够使用 setter 方法更改属性值时,封装有什么用? ”这个问题,上面给出了我们使用封装的一些主要原因。为了理解getter 和 setter 为何有用,下面给出了从本文中获得的一些重要观点。
您可以限制字段中可以存储的值(即性别必须为 F 或 M)。
您可以在字段修改时采取操作(触发事件、验证等)。
您可以通过同步方法来提供线程安全性。
您可以切换到新的数据表示形式(即计算字段、不同的数据类型)
| 归档时间: |
|
| 查看次数: |
29489 次 |
| 最近记录: |