使用私有成员或公共访问者的方法

时间:2012-06-05 17:18:10

标签: java coding-style

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

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

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

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

3 个答案:

答案 0 :(得分:8)

这是一种风格调用。我更喜欢使用访问器,因为IMHO函数调用开销足够小,在大多数情况下无关紧要,这种用法保留了数据抽象。如果我后来想要改变数据的存储方式,我只需要更改访问者,而不是寻找触及变量的所有地方。

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

答案 1 :(得分: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并不重要,但是您可能希望使用get来尊重您的标准代码。

最后,归结为编码风格。

答案 2 :(得分:2)

我有其他对象,包括对象的子类,使用访问器,但是对象本身使用字段。这样,内部与世界其他地方的界面就明显不同了。隐藏类的内容似乎是不必要的,并且可能令人困惑。如果某些东西确实从将其实现隐藏在对象的其他部分中而受益,那么将其分解为单独的对象。