【发布时间】:2016-09-02 06:21:00
【问题描述】:
我对 getter 和 setter 如何提供封装感到困惑。我的意思是直接给变量赋值和通过getter和setter赋值有什么区别。还可以说我们有两个类 A 和 B。在使用 getter 和 setter 从类 B 中设置值时,我们必须在类 B 中创建类 A 的对象,那么当我们已经知道它们在哪个类中时,如何封装变量已定义。
【问题讨论】:
标签: java encapsulation getter-setter
我对 getter 和 setter 如何提供封装感到困惑。我的意思是直接给变量赋值和通过getter和setter赋值有什么区别。还可以说我们有两个类 A 和 B。在使用 getter 和 setter 从类 B 中设置值时,我们必须在类 B 中创建类 A 的对象,那么当我们已经知道它们在哪个类中时,如何封装变量已定义。
【问题讨论】:
标签: java encapsulation getter-setter
使用 setter,我们可以对指定的值应用额外的验证,当您将值直接分配给属性时,这是不可能的。一个例子可以是检查值是否不为空,例如:
public void setVariable(Object value) {
if (value == null) {
throw new IllegalArgumentException();
} else {
...
}
}
您使用 setter 获得的其他可能性是您可以应用额外的计算。例如,如果您有一个 BankAccount 实例并且您更改了利息,那么设置器可以重新计算必须支付给用户的利息。
您通过应用 getter 获得的一种可能性是,您可以返回默认值,以防该值尚未设置。
getter 和 setter 的另一个应用是限制对变量的访问。例如,我们可以在 setter 受到保护时将 getter 公开。这意味着每个人都可以读取该属性,但只有扩展其他类或位于同一包中的类才能设置该值。
关于你的第二个问题。我不完全理解这个问题。你能详细说明一下吗?
【讨论】:
您封装了声明它们的变量private,因此其他类在没有getter 或setter 方法的情况下无法访问它们。例如:
private int num; //variable to-be defined from constructor
public int getNum(){
return num;
}
其他对象不能在不使用getNum()方法的情况下从this对象访问私有num变量。
如果要更改封装的变量:
public void changeNum(int n){
num = n;
}
num 变量的更改不会破坏 java 语法。
【讨论】:
Getter 是公共的,而 setter 是私有的(通常)。这意味着任何对象都可以读取我们类的变量,但只有我们类的对象可以改变它们的值。这提供了某种意义上的封装,“它不会为其他对象提供比他们需要的更多的访问权限”。这是合乎逻辑的,因为假设我们的班级是汽车,而我们的对象是法拉利。比如说,新变量是法拉利的马力。只有法拉利制造商才能改变法拉利提供的马力价值。其他人只能读取,不能更改。
回答您的第二个问题,当创建 A 的对象时,您需要初始化 A 的所有(或至少一些)变量。这类似于在上面的类比中,创建一辆新的法拉利汽车。一旦你创建了法拉利,你显然必须知道它的所有变量。此外,这里假设 B 类是“安全”类,例如 Main。 B 不能是梅赛德斯或奥迪。 (这是程序员需要处理的事情,再次通过对法拉利类使用公共/私有封装)梅赛德斯或奥迪类将无权创建法拉利汽车。只有“Main”和“Ferrari”才有。
【讨论】: