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

23c0lvtd  于 2021-06-30  发布在  Java
关注(0)|答案(1)|浏览(311)

据我所知,封装对外部人员隐藏了数据成员,并且只允许它使用同一类的方法进行访问。这样他们就不能把你的个人资料给外人看了。按道理说是真的,

private double amount;

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

这里您的amount变量不会与使用private的外部人员共享,他们也不知道您使用的变量名。
但在类似的情况下,我们也提供了getter/setter来访问它们,所以如何才能使封装从外部变得安全呢?

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

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

这意味着getter或setter方法很可能具有相同的模式,而局外人对此有基本的了解。所以我想,在做了一些尝试之后,他能够使用getter获取或使用setter更改。在这种情况下,直接定义amount public或提供getter两者变得相同。
有人能解释一下吗?

pxq42qpu

pxq42qpu1#

假设您有一个包含一百万行代码的程序,包括您已经提供的代码。除非你的财产是公开的。
现在,想象一下,在代码中,你在第600行设置这个值等于300.00,然后在第4547行再次设置为500.50
然后在585676行,你再做一次。
然后你运行你的程序,你会遇到错误。你不知道这个错误是从哪里来的,因为它都是有效的代码。然后您意识到amount肯定有问题,但由于您只是直接访问amount属性,因此您在调试该属性时遇到了麻烦。
然后,想象一下í例如,您创建了一组独立的类,所有这些类都访问amount属性并对其进行更改。所以你永远得不到你想要的量,你也不知道它在哪里变化。
最后,假设你决定在你的金额上加上14%的销售税,那么每个金额都是x*0.14。您可以在类中添加逻辑,但是由于您将属性设置为public,因此在您直接将值赋给amount的所有示例中,不会强制执行该逻辑。
基本上:设置和获取是安全措施。您不希望其他类能够更改其他类中的属性。我们使用的示例很简单,但是假设您有一个具有非常复杂属性的类,并且您最终意外地更改了这些属性的逻辑,因为您没有使用setter。
同样的情况也适用于getter。想象一下相反的情况,你改变了类的内部逻辑,但是你通过一些其他的方法得到了它的属性值,而不是getter,现在你所有的代码都被破坏了,因为其他访问属性的类没有意识到逻辑的改变。

相关问题