【问题标题】:Methods using private members or public accessors使用私有成员或公共访问器的方法
【发布时间】:2012-06-05 17:18:09
【问题描述】:

我意识到这可能无法回答,但我正在寻找关于是直接使用私有成员还是在类方法中使用公共访问器的某种指导。

例如,考虑以下代码(在 Java 中,但在 C++ 中看起来非常相似):

public class Matrix {

    // Private Members
    private int[][] e;
    private int numRows;
    private int numCols;

    // Accessors
    public int rows(){ return this.numRows; }
    public int cols(){ return this.numCols; }

    // Class Methods
    // ...
    public void printDimensions()
    {
        // [A] Using private members
        System.out.format("Matrix[%d*%d]\n", this.numRows, this.numCols);


        // [B] Using accessors
        System.out.format("Matrix[%d*%d]\n", this.rows(), this.cols());
    }

printDimensions() 函数说明了获取相同信息的两种方法,[A] 使用私有成员 (this.numRows, this.numCols) 或 [B] 通过访问器 (this.rows(), this.cols())。

一方面,您可能更喜欢使用访问器,因为您不可能无意中更改私有成员变量的值。另一方面,您可能更喜欢直接访问私有成员,希望它会删除不必要的函数调用。

我想我的问题是,是事实上的标准还是首选?

【问题讨论】:

  • 代码是 Java,而不是 C++,删除标签。无论如何,这个问题可能比 Java 或 C++ 更语言不可知...
  • 这个变得虔诚。我认为没有标准。不过,我会尽可能关闭this.
  • 我同意它似乎与语言无关,这就是我最初包含 C++ 的原因,以免将问题的范围限制在 Java 上。
  • Java getter vs this的可能重复

标签: java coding-style


【解决方案1】:

这是一种风格的召唤。我更喜欢使用访问器,因为恕我直言,函数调用开销足够小,在大多数情况下并不重要,并且这种用法保留了数据抽象。如果我以后想改变数据的存储方式,我只需要改变访问器,而不是寻找我接触到变量的所有地方。

不过,我对此并不强烈,如果我认为我有充分的理由,我会打破这个“规则”。

【讨论】:

  • 另一个例子是如果你让类线程安全并且rows需要以某种方式被访问(例如持有锁)。
  • @assylias,如果您想从锁内访问多个变量,这将无济于事。
【解决方案2】:

恕我直言,访问器更多的是结构和数据管理问题,而不是访问器本身。有时,您需要在返回某些数据之前对其进行预处理。想想这个例子:

public class Foo {

    private List<Bar> bars = null;

    //Methods and stuff

    public List<Bar> getBars() {
        if(bars == null)
            bars = SomeClass.loadBars();
            // You can also use 
            // setBars(SomeClass.loadBars());
        return bars;
    }

}

在这种情况下,您的 getter 不仅包装您的字段,而且在您调用它时返回一个已初始化的字段。在类中使用访问器与对局外人具有相同的好处,您可以将自己从字段的特定细节中抽象出来,并在处理后获取它。

另一方面,如果您的字段是直接返回的(例如,一个字符串),您是否使用 get 并不重要,但您可能希望使用 get 来尊重您的标准代码。

归根结底,这一切都归结为编码风格。

【讨论】:

    【解决方案3】:

    我有其他对象,包括对象的子类,使用访问器,但让对象本身使用字段。这样,内部结构和与世界其他地方的接口之间就有了明显的区别。对自身隐藏类的内容似乎是不必要的,并且可能会造成混淆。如果某些东西真正受益于将其实现隐藏在对象的其他部分中,那么将其分解为一个单独的对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-22
      • 2023-04-08
      • 2016-06-06
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      相关资源
      最近更新 更多