当前位置: 首页 > 知识库问答 >
问题:

当我能够使用setter方法更改属性值时,封装有什么用?

景承教
2023-03-14

我试着理解很多次,但我没有理解这一点。

封装是使类中的字段私有并通过公共方法提供对字段的访问的技术。如果一个字段被声明为private,则类外的任何人都无法访问它,从而隐藏类内的字段。

我们如何通过setter方法改变字段的值?我们如何防止直接访问字段?封装的真正用途是什么?

共有3个答案

欧阳骏俊
2023-03-14

封装的真正用途还在于,您可以对值的设置方式进行额外的检查/处理。

咸正平
2023-03-14

我也和你一样困惑了很长时间,直到我读了《面向对象编程语言中的封装和继承》一书以及一个解释封装重要性的网站。事实上,我是从网站上直接读这本书的。

人们总是说封装是“信息的隐藏”,因此,也许封装的主要用途是安全性。是的,你实际上是在隐藏信息,但这不应该是定义,因为它可能会混淆人们。

封装只是“通过定义严格的外部接口来最小化单独编写的模块之间的相互依赖”(引用自本书)。也就是说,当我构建模块时,我希望我的客户和我之间就如何访问我的模块达成严格的合同。原因是,我可以在不影响我的客户、生活、应用程序或他们使用我的模块的任何东西的情况下改进内部工作。因为他们的“模块”并不完全依赖于我模块的内部工作,而是依赖于“外部接口”,所以我向他们提供了。

因此,如果我不为我的客户提供一个setter,让他们直接访问变量,我意识到我需要对变量设置一些限制,然后我的客户才能使用它,我改变它,可能是我,改变我客户的生活,或者花巨资应用我的客户。但是如果我通过创建一个“严格的外部接口”(即setter)来提供“严格的合同”,那么我就可以很容易地改变我的内部工作,而对我的客户来说几乎没有或根本没有任何费用。

setter情况下(使用封装),如果您设置了一个变量,我返回一条消息通知您它已被分配,现在我可以通过我的“接口”发送一条消息,通知我的客户我的模块必须与之交互的新方式,即“您不能分配负数”,即如果我的客户尝试分配负数。但如果我不使用封装,让我的客户机直接访问一个变量,然后我进行更改,可能会导致系统崩溃。因为如果我实施的限制是,你不能保存底片,而我的客户总是能够存储底片,我的客户手中就会有一个崩溃的系统(如果“崩溃的系统”是银行系统,想象一下会发生什么)。

因此,封装更多地是为了减少模块之间的依赖性,可以“悄悄地”进行改进,而与之交互的其他模块所需的费用很少或没有,而不是安全性。因为交互模块依赖于“严格的外部接口或严格的契约”。

我希望这解释得很好。如果没有,你可以去下面的链接自己阅读。

封装材料

面向对象编程语言中的封装和继承

谭晓博
2023-03-14

假设您有一个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.
}
 类似资料:
  • 问题内容: 我试图了解很多次,但是我却不明白。 封装是一种将类中的字段设为私有并通过公共方法提供对字段的访问的技术。如果某个字段被声明为私有,那么该类之外的任何人都无法访问该字段,从而将这些字段隐藏在该类中。 我们如何通过setter方法更改字段的值?我们如何防止直接访问这些字段?封装的真正用途是什么? 问题答案: 假设您有财产。 用户可以输入的值,尽管该值是有效数字,但它是无效年龄。setter

  • 然后用Gson lib将响应转换为我们需要的对象。 这来自Square/OKHTTP文档: 它的请求/响应API是用流畅的构建器和不变性设计的。它同时支持同步阻塞调用和带有回调的异步调用

  • 据我所知,封装对外部人员隐藏了您的数据成员,并且只允许它使用相同类的方法访问。因此他们无法向外部人员显示您的个人数据。遵循这是真的, 在这里,您的金额变量不会与使用private的外部用户共享,他们也不知道您使用的变量名称。 但在类似的情况下,我们还提供了访问它们的getter/setter,那么封装如何能够从外部安全地进行呢? 这意味着getter或setter方法很可能具有相同的模式,而局外人

  • 当我使用“Launch TestRunner”在我的项目中运行所有测试时,我在SoapUI中更新项目属性时遇到了一些问题。 我有两个带有测试的测试套件。所有测试用例都有第一步-Groovy脚本。这个脚本在所有测试用例中都是一样的: 我有一个项目属性:“IdAndKey”和“bool”。当我运行单个测试用例时 - 这个项目属性正在更新,但是当我运行所有测试时,它们没有更新(我只在日志中看到更新,而不

  • 问题内容: 我正在编写一个API解析Twitter机器人,对OOP来说是个新手。我有一些依赖于全局变量的现有Python代码,并认为我可以借此机会学习。 我有以下Team类,这些类在解析API时会更新,并且希望在类属性更改时能够调用完全不相关的(外部)方法。 对于现有实例,何时更改,我希望调用以下方法(伪代码): 两件事情 - 一旦检测到属性已更改,如何从班级内部调用? 我可以从任何地方访问对象的

  • 问题内容: 我看到成员变量被赋予了私有修饰符,然后使用getter / setter方法只是为了设置和获取变量的值(以标准化的名义)。 然后为什么不将变量本身公开(除了像spring框架这样的案例,该案例依赖于IOC的getter / setter方法)。它达到目的。 在C#中,我看到成员变量的大小写为getter / setter。为什么不将变量本身公开? 问题答案: 为了从一开始就获得 稳定的