【问题标题】:What is the role of getter / setter in encapsulation?getter/setter在封装中的作用是什么?
【发布时间】:2020-12-19 06:48:58
【问题描述】:

据我所知,封装对外部人员隐藏了您的数据成员,并且只允许它使用同一类的方法进行访问。这样他们就无法向外界显示您的个人数据。顺其自然,

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 进行更改。在这种情况下,直接 public 定义数量或提供 getter 两者都变得相同。

谁能解释一下?

【问题讨论】:

  • 嗯,这个问题基本上等于问“为什么我们有墙,人们也可以通过门进入”。你,程序员,控制着门,你选择谁和如何进来。当你允许你的例子中的一切,那么这取决于你,但是当你没有墙时,你就没有什么可以检查/验证/阻止。

标签: java oop


【解决方案1】:

假设您有一个包含一百万行代码的程序,包括您已经提供的代码。除非您的金额财产是公开的。

现在,假设在该代码中,您在第 600 行设置金额等于 300.00 然后在第 4547 行再次将其设置为 500.50

然后在第 585676 行再执行一次。

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

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

最后,假设您决定要在您的金额中添加 14% 的销售税,这样每个金额将为 x * 0.14。您可以在类中添加逻辑,但由于您将属性设置为公共,因此不会在您直接将值分配给数量的所有实例中强制执行该逻辑。

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

吸气剂也是如此。想象一下相反的情况,您更改了类的内部逻辑,但是您通过某种不是 getter 的其他方式获取其属性的值,现在您的所有代码都被破坏了,因为其他类正在访问该属性没有意识到逻辑的变化。

【讨论】:

  • 我想你的意思是 x * 1.14?
  • 嗯? 14% 的十进制表示为 0.14。百分比的十进制表示必须加起来为 1。1.14 不是 14%,而是 114%。
猜你喜欢
  • 2018-05-05
  • 1970-01-01
  • 1970-01-01
  • 2014-06-18
  • 2017-05-21
  • 2019-01-30
  • 1970-01-01
  • 2016-09-02
  • 2015-03-29
相关资源
最近更新 更多