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

getter/setter在封装中的作用是什么?

冯宏恺
2023-03-14

据我所知,封装对外部人员隐藏了您的数据成员,并且只允许它使用相同类的方法访问。因此他们无法向外部人员显示您的个人数据。遵循这是真的,

private double amount;

public void add(double value) {
    return this.amount + value;
}

在这里,您的金额变量不会与使用private的外部用户共享,他们也不知道您使用的变量名称。

但在类似的情况下,我们还提供了访问它们的getter/setter,那么封装如何能够从外部安全地进行呢?

public void setAmount(double value) {
    this.amount = value;
}

public double getAmount() {
    return this.amount;
}

这意味着getter或setter方法很可能具有相同的模式,而局外人对此有基本的了解。所以我假设在做了一些尝试后,他能够使用getter或使用setter进行更改。在这种情况下,直接公开定义数量或提供getter两者变得相同。

有人能解释一下吗?

共有1个答案

危飞文
2023-03-14

想象一下,你有一个包含一百万行代码的程序,包括你已经提供的代码。除了你的金额属性是公开的。

现在,想象一下在那段代码中,你在第600行设置该值等于300.00,然后在第4547行再次设置为500.50

然后在第585676行,你再做一次。

然后你运行你的程序,你遇到了错误。你不知道这个错误是从哪里来的,因为它都是有效的代码。然后你意识到这一定是金额有问题,但是由于你只是直接访问你的金额属性,你最终会有一个可怕的时间试图调试它。

然后,想象一下,你创建了一堆独立的类,所有这些类都在访问这个数量属性并对其进行更改。所以你永远也得不到你想要的数量,你也不知道它在哪里变化。

最后,假设您决定向金额中添加14%的增值税,以便每个金额都是x*0.14。您可以在类中添加逻辑,但由于您将属性设置为public,因此在您直接将值赋给amount的所有实例中都不会强制执行该逻辑。

基本上:setter和getter是安全措施。您不希望其他类能够更改其他类中的属性。我们使用的示例很简单,但假设您有一个具有非常复杂属性的类,并且您最终意外地更改了这些属性的逻辑,因为您没有使用setter。

对于getter也是如此。想象一下相反的情况,你改变了类的内部逻辑,但是你通过其他一些不是getter的方式获得了它的属性值,现在你所有的代码都被破坏了,因为其他访问属性的类没有意识到逻辑的变化。

 类似资料:
  • 问题内容: 我读过一些书,说为诸如和的变量创建setter和getter很好。例如: 但这有什么区别? 和 如果二传手和消气手更好,您能给我解释一下实际问题吗? 问题答案: 多个原因: 如果您允许像 shape.x = 90 那么您将来将无法添加任何逻辑来验证数据。 如果x不能小于100,就不能这样做,但是如果您有像 您不能在写入逻辑上添加诸如复制之类的内容(请参见CopyOnWriteArray

  • 问题内容: 请原谅它的长度,但是这里有两个程序,两者完全相同,但是一个有一个没有setter,getter和构造函数的程序。 我之前已经学过一个基本的C ++类,并且不记得其中的任何一个,而现在我还没有看到它们的意义,如果有人可以用拉面的术语来解释它们的话,我将不胜感激。目前,它们似乎不过是浪费空间,以使我的代码看起来更长,但是老师说它们很重要(到目前为止,就是这样)。 提前致谢!现在是代码:Mi

  • 可以使用声明私有变量并通过公共getter/setter方法(Java中的封装原则)访问它来在setter方法中添加自定义验证。 例如:如果我在

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

  • 问题内容: 我这样做: 要么 我是Python的新手,所以我仍在探索语法,并且我想在此方面提供一些建议。 问题答案: 试试这个:Python属性 示例代码是:

  • 利用 getter/setter 可以拦截操作对象的属性,在设置属性前或获取属性前做一些事情。 1. getter get语法将对象属性绑定到查询该属性时将被调用的函数。(MDN) // 语法 var 对象 = { get 属性名() { // 做一些事情 balabala return 值; } }; getter 在获取一个属性时被调用,同时返回 getter 的返回