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 它可以在必要时通过访问器公开它。