【问题标题】:Java : Accessor methods vs protected fieldsJava:访问器方法与受保护字段
【发布时间】:2016-07-19 06:39:11
【问题描述】:

我知道很多编码人员使用访问器方法来访问一些对其他类来说是私有的类字段,但我想知道为什么。为什么他们不喜欢只能从同一个包的类而不是访问器访问的受保护字段?我的意思是,如果没有严重的原因,那只是代码浪费。

【问题讨论】:

  • 您应该只对需要访问的字段使用访问器。 protected 只是扩展了可访问性,您应该考虑使用 protected getter 而不是字段(如果需要,您可以在不破坏代码的情况下移动字段)。由于这个原因,一些开发人员认为所有字段都应该是私有的。确实,您应该尽量避免使用访问器,而是找到为什么您需要访问该状态的原因。找到原因后,将该原因封装到行为中。 Getter 是一种打破封装的简单方法。

标签: java oop methods accessor


【解决方案1】:

当您只定义访问字段的方法时,您会受到方法的限制。你不能做没有方法的事情。

考虑这个类:

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 实际上更接近于公共而不是私有。如果您有一个私有字段,它将永远是私有的。如果您的字段受到保护,任何人都可以随时扩展您的类并访问该字段。如果它打算是私有的并且您将其设置为受保护,那么当有人扩展它时它可能会失去其用途(并且他扩展的事实不再有意义,因为他的新类的行为不符合超类的精神)。

【讨论】:

    【解决方案2】:

    像getter 或setter 这样的mutuator 方法与protected 变量不同。

    如果访问受保护变量的人有权访问它,则您无法控制何时读取或写入受保护变量,但 mutuator 充当桥梁,能够拦截修改或访问底层成员属性并提供与仅返回/设置值不同的行为。所以它们的目的并不完全相同。

    除了使用 mutuators 之外,您还可以提供对 private 成员变量的只读或只写访问权限,但不能通过 protected 字段来实现。

    【讨论】:

      【解决方案3】:

      使用访问器/修改器方法是 Java 编程和其他语言中常见的最佳实践。

      Wikipedia 建议:

      mutator 方法最常用于面向对象的编程中,符合封装的原则。根据这一原则,将类的成员变量设为私有以隐藏和保护它们不受其他代码的影响,并且只能通过公共成员函数(mutator方法)进行修改,该函数将所需的新值作为参数,可选地验证它,并修改私有成员变量。

      因此,在设置或获取私有变量值之前,您可以使用访问器隐藏应用的逻辑(如果存在)。

      protected 修饰符应该用于标记不打算公开访问但应该由子类继承和可见的变量(或方法)。子类可以在其方法中使用此变量和/或在必要时通过访问器公开它。

      【讨论】:

        猜你喜欢
        • 2010-10-18
        • 2015-05-09
        • 2020-07-26
        • 2020-11-02
        • 2019-08-18
        • 2011-01-17
        • 1970-01-01
        • 2012-05-26
        • 1970-01-01
        相关资源
        最近更新 更多