如何使用 getter 和 setter 进行封装
how to use getter and setter for Encapsulation
我对 getter 和 setter 如何提供封装感到困惑。我的意思是直接给变量赋值和通过 getter 和 setter 赋值有什么区别。还假设我们有两个 class A 和 B。在使用 getter 和 setter 设置 class B 的值时,我们必须创建一个 class 的对象A在class B中,那么当我们已经知道变量定义在哪个class中时,变量如何封装。
您封装声明它们的变量 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;
}
在不破坏 java 语法的情况下更改了 num
变量。
使用 setters 我们可以对指定的值应用额外的验证,当您将值直接分配给 属性 时,这是不可能的。一个示例可能是检查该值是否不为空,例如:
public void setVariable(Object value) {
if (value == null) {
throw new IllegalArgumentException();
} else {
...
}
}
您使用 setters 获得的其他可能性是您可以应用额外的计算。例如,如果您有一个 BankAccount 实例并且您更改了利息,setter 可能会重新计算必须支付给用户的利息。
通过应用 getter 获得的一种可能性是您可以 return 默认值,以防尚未设置该值。
getter 和 setter 的另一个工具是限制对变量的访问。例如,我们可以使 getter public 而 setter 受到保护。这意味着每个人都可以阅读 属性,但只有扩展了另一个 class 的 class 或位于同一包中的 class 才能设置该值。
关于你的第二个问题。我不完全理解这个问题。你能详细说明一下吗?
getter 是 public 并且 setter 是私有的(通常)。这意味着任何对象都可以读取我们的 class 的变量,但只有我们的 class 的对象可以更改它们的值。这提供了 "it doesn't give other objects more access than they need" 意义上的封装。这是合乎逻辑的,因为假设我们的 class 是一辆汽车,而我们的对象是法拉利。例如,新变量是法拉利的马力。只有法拉利制造商才能改变法拉利赋予的马力价值。其他人只能阅读,不能更改。
回答你的第二个问题,当创建了A的对象时,你将需要初始化A的所有(或至少一些)变量。这类似于在上面的类比中创建一辆新的法拉利汽车。一旦你创造了法拉利,你显然必须知道它的所有变量。此外,这里 class B 被假定为“安全的”class,比如 Main。 B 不能是梅赛德斯或奥迪。 (这是程序员需要处理的事情,再次通过使用 public/private 封装法拉利 class)梅赛德斯或奥迪 classes 将没有创建法拉利汽车的权限。只有 "Main" 和 "Ferrari" 会有。
我对 getter 和 setter 如何提供封装感到困惑。我的意思是直接给变量赋值和通过 getter 和 setter 赋值有什么区别。还假设我们有两个 class A 和 B。在使用 getter 和 setter 设置 class B 的值时,我们必须创建一个 class 的对象A在class B中,那么当我们已经知道变量定义在哪个class中时,变量如何封装。
您封装声明它们的变量 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;
}
在不破坏 java 语法的情况下更改了 num
变量。
使用 setters 我们可以对指定的值应用额外的验证,当您将值直接分配给 属性 时,这是不可能的。一个示例可能是检查该值是否不为空,例如:
public void setVariable(Object value) {
if (value == null) {
throw new IllegalArgumentException();
} else {
...
}
}
您使用 setters 获得的其他可能性是您可以应用额外的计算。例如,如果您有一个 BankAccount 实例并且您更改了利息,setter 可能会重新计算必须支付给用户的利息。
通过应用 getter 获得的一种可能性是您可以 return 默认值,以防尚未设置该值。
getter 和 setter 的另一个工具是限制对变量的访问。例如,我们可以使 getter public 而 setter 受到保护。这意味着每个人都可以阅读 属性,但只有扩展了另一个 class 的 class 或位于同一包中的 class 才能设置该值。
关于你的第二个问题。我不完全理解这个问题。你能详细说明一下吗?
getter 是 public 并且 setter 是私有的(通常)。这意味着任何对象都可以读取我们的 class 的变量,但只有我们的 class 的对象可以更改它们的值。这提供了 "it doesn't give other objects more access than they need" 意义上的封装。这是合乎逻辑的,因为假设我们的 class 是一辆汽车,而我们的对象是法拉利。例如,新变量是法拉利的马力。只有法拉利制造商才能改变法拉利赋予的马力价值。其他人只能阅读,不能更改。
回答你的第二个问题,当创建了A的对象时,你将需要初始化A的所有(或至少一些)变量。这类似于在上面的类比中创建一辆新的法拉利汽车。一旦你创造了法拉利,你显然必须知道它的所有变量。此外,这里 class B 被假定为“安全的”class,比如 Main。 B 不能是梅赛德斯或奥迪。 (这是程序员需要处理的事情,再次通过使用 public/private 封装法拉利 class)梅赛德斯或奥迪 classes 将没有创建法拉利汽车的权限。只有 "Main" 和 "Ferrari" 会有。