2012-06-05 88 views
6

我意識到這可能不是回答,但我正在尋找是否存在關於是否在類方法中直接使用私有成員或公共訪問器的某種指導。使用私人會員或公共訪問者的方法

例如,請考慮下面的代碼(在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())。

一方面,您可能更喜歡使用訪問器,因爲您無法無意中更改私有成員變量的值。另一方面,你可能更希望直接訪問私有成員,希望能夠刪除不必要的函數調用。

我想我的問題是,是事實上的標準還是首選?

+0

代碼是Java,而不是C++,刪除標籤。無論如何,這個問題可能比Java或C++更多的*語言不可知的* –

+1

這個人得到宗教信仰。我不認爲有一個標準。但是,只要有可能,我都會將'this.'關閉。 –

+0

我同意它似乎是語言不可知的,這就是爲什麼我原來包含C++,因爲不會將問題的範圍限制爲Java。 – jedwards

回答

6

這是一個風格的電話。我更喜歡使用訪問器,因爲恕我直言,函數調用開銷足夠小,在大多數情況下它並不重要,並且此用法保留了數據抽象。如果我後來想改變數據的存儲方式,我只需要更改訪問器,而不是尋找所有觸及變量的地方。

儘管如此,我並沒有強烈的感覺,如果我認爲我有充分的理由,我會打破這個「規則」。

+0

另一個例子是,如果你讓類線程安全並且需要訪問「rows」以某種方式(例如持有鎖)。 – assylias

+0

@assylias,如果你想從鎖內訪問多個變量,這將無濟於事。 – finnw

1

我有其他對象,包括對象的子類,使用訪問器,但有對象本身使用字段。這樣內部結構和與世界其他地方的接口就有了明顯的區別。從本身隱藏課程的內容似乎是不必要的,可能會令人困惑。如果某些東西真正從其對象的其他部分隱藏起來,那麼將其分解爲一個單獨的對象。

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來尊重標準你的代碼。

最後,它歸結爲編碼風格。