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

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())。

一方面,您可能更喜欢使用访问器,因为没有办法不小心更改私有成员变量的值。 另一方面,您可能更喜欢直接访问私有成员,希望这将消除不必要的函数调用。

我的问题是,是否有任何标准或首选?


代码是Java,不是C++,正在移除标签。无论如何,问题可能更加与语言无关,而不是Java或C++... - David Rodríguez - dribeas
1
这个问题有点神圣化了。我觉得没有一个标准的做法。但是尽可能地,我会避免使用 this. 这个前缀。 - Tony Ennis
我同意这似乎是与语言无关的,这就是为什么我最初包括了C++,以免限制问题的范围只在Java上。 - jedwards
可能是Java getter vs this的重复问题。 - assylias
3个回答

8

这是一种风格调用。在我看来,使用访问器更好,因为函数调用开销通常很小,不会对大多数情况产生影响,并且这种用法保留了数据抽象。如果以后我想改变数据存储方式,我只需要改变访问器,而不是寻找我修改变量的所有地方。

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


另一个例子是,如果您使类线程安全,并且需要以某种方式(例如,在保持锁定的情况下)访问“rows”。 - assylias
@assylias,如果你想从锁内部访问多个变量,那么这并没有什么帮助。 - finnw

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

我有其他对象,包括对象的子类,使用访问器,但是让对象本身使用字段。这样就可以清楚地区分内部和与世界其他部分的接口。将类的内容隐藏起来似乎是不必要的,可能会令人困惑。如果某些东西真正受益于将其实现隐藏在对象的其他部分之外,则将其拆分为单独的对象。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接