Java:访问器方法与受保护字段
Java : Accessor methods vs protected fields
我知道很多编码人员使用访问器方法来访问一些 class 字段,这些字段对其他 classes 是私有的,但我想知道为什么。为什么他们不喜欢受保护的字段 只能从同一包的 class 访问而不是访问器?我的意思是如果没有严重的原因,那只是代码浪费。
像 getter 或 setter 这样的变异器方法与 protected
变量不同。
如果访问受保护变量的人有权访问它,则您无法控制何时读取或写入受保护变量,但变异器充当桥梁,能够拦截修改或访问底层成员属性,并且还提供与 returning/setting 值不同的行为。所以他们并没有达到完全相同的目的。
除了变异器之外,您还可以提供对 private
成员变量的只读或只写访问权限,但您不能对 protected
字段执行此操作。
当你只定义访问字段的方法时,你会受到方法的限制。你不能做没有方法的事情。
考虑这个 class:
public class Account {
private int balance = 0;
public int getBalance() {
return balance;
}
public void insert(int amount) {
if(amount > 0) {
balance += amount;
}
}
public void withdraw(int amount) {
if(amount > 0 && amount =< balance) {
balance -= amount;
}
}
}
您可以通过插入和取出来改变账户余额,您可以查看它是什么。但是如果你可以直接访问余额,你可以做一些不可能的事情,比如:
Account acc = new Account();
acc.balance = -10;
此外,protected 实际上更接近 public 而不是 private。如果你有一个私人领域,它将永远是私人的。如果您的字段受到保护,任何人都可以随时扩展您的 class 并访问该字段。如果它打算是私有的并且你将它设置为受保护的,那么当有人扩展它时它可能会失去它的目的(而且他扩展的事实不再有意义,因为他的新 class 不符合精神超级class).
使用 accessors/mutators 方法是 Java 编程和其他语言中常见的最佳实践。
Wikipedia 建议:
The mutator method is most often used in object-oriented programming, in keeping with the principle of encapsulation. According to this principle, member variables of a class are made private to hide and protect them from other code, and can only be modified by a public member function (the mutator method), which takes the desired new value as a parameter, optionally validates it, and modifies the private member variable.
因此您使用访问器来隐藏在设置或获取私有变量值之前应用的逻辑(如果存在)。
protected
修饰符应该用于标记不打算公开访问的变量(或方法),但应该由子 classes 继承和可见。 sub class 可以在它的方法中使用这个变量 and/or 它可以在必要时通过访问器公开它。
我知道很多编码人员使用访问器方法来访问一些 class 字段,这些字段对其他 classes 是私有的,但我想知道为什么。为什么他们不喜欢受保护的字段 只能从同一包的 class 访问而不是访问器?我的意思是如果没有严重的原因,那只是代码浪费。
像 getter 或 setter 这样的变异器方法与 protected
变量不同。
如果访问受保护变量的人有权访问它,则您无法控制何时读取或写入受保护变量,但变异器充当桥梁,能够拦截修改或访问底层成员属性,并且还提供与 returning/setting 值不同的行为。所以他们并没有达到完全相同的目的。
除了变异器之外,您还可以提供对 private
成员变量的只读或只写访问权限,但您不能对 protected
字段执行此操作。
当你只定义访问字段的方法时,你会受到方法的限制。你不能做没有方法的事情。
考虑这个 class:
public class Account {
private int balance = 0;
public int getBalance() {
return balance;
}
public void insert(int amount) {
if(amount > 0) {
balance += amount;
}
}
public void withdraw(int amount) {
if(amount > 0 && amount =< balance) {
balance -= amount;
}
}
}
您可以通过插入和取出来改变账户余额,您可以查看它是什么。但是如果你可以直接访问余额,你可以做一些不可能的事情,比如:
Account acc = new Account();
acc.balance = -10;
此外,protected 实际上更接近 public 而不是 private。如果你有一个私人领域,它将永远是私人的。如果您的字段受到保护,任何人都可以随时扩展您的 class 并访问该字段。如果它打算是私有的并且你将它设置为受保护的,那么当有人扩展它时它可能会失去它的目的(而且他扩展的事实不再有意义,因为他的新 class 不符合精神超级class).
使用 accessors/mutators 方法是 Java 编程和其他语言中常见的最佳实践。
Wikipedia 建议:
The mutator method is most often used in object-oriented programming, in keeping with the principle of encapsulation. According to this principle, member variables of a class are made private to hide and protect them from other code, and can only be modified by a public member function (the mutator method), which takes the desired new value as a parameter, optionally validates it, and modifies the private member variable.
因此您使用访问器来隐藏在设置或获取私有变量值之前应用的逻辑(如果存在)。
protected
修饰符应该用于标记不打算公开访问的变量(或方法),但应该由子 classes 继承和可见。 sub class 可以在它的方法中使用这个变量 and/or 它可以在必要时通过访问器公开它。