7

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

例如,考虑以下代码(在 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())。

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

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

4

3 回答 3

8

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

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

于 2012-06-05T17:22:34.167 回答
3

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

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 来尊重代码中的标准。

最后,这一切都归结为编码风格。

于 2012-06-05T17:41:25.113 回答
2

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

于 2012-06-05T17:40:02.917 回答