2013-04-18 62 views
5

想象我有一類具有一個實例成員將實例變量傳遞給實例方法與直接訪問它們?

String instanceMember; 

此外我有樣4的實例方法訪問該構件。現在我想知道是否有任何真正的pro/con從實例方法直接訪問實例成員,或者將實例成員作爲參數傳遞給每個實例方法?

+0

基本上,什麼「感覺不錯」。有時候傳遞引用是個好主意,就像你正在操作的一種「文檔」一樣。 (但是如果它開始看起來是錯誤的,永遠不要害怕回去改變一個parm傳遞方案 - 許多暴行都是以避免(微不足道的)改變爲名承諾的。) –

回答

0

如果這些方法是操縱持久化成員變量狀態的公共方法,那麼您不應該將它傳遞給它。例如,如果你有做類似下面,可能應該直接由該方法操作的,而不是在傳遞:

myObject.SomeMethod(myObject.instanceMember, 15); 

這真的應該僅僅是:

myObject.SomeMethod(15); 

如果它是每次調用都可能會發生變化(例如,上述方法中神祕的15),則您需要傳遞它。

6

將該值作爲參數傳遞意味着您將使用參數值而不是封裝值執行計算。

如果您打算對封裝數據進行操作,那麼沒有理由將其作爲參數。

1

的原因有例如在首位變量是爲了避免將它們作爲參數:你實例方法獲得訪問它們的「免費」的,因爲他們已經在法的範圍。

有通過實例變量的方法有兩個原因,雖然:

  • 的方法是static - 類方法不能訪問實例變量,所以你需要明確地傳遞他們,或通過在物體上要運行
  • 您需要使用按值傳遞語義 - 換句話說,您想要修改傳入的值,並且您希望避免創建局部變量。當方法是遞歸時通常是這種情況。

如果你發現自己編寫遞歸代碼,修改它開始作爲一個實例變量的參數,在很多情況下,它可能是一個好主意,使你的方法private static,並添加public實例方法來啓動遞歸鏈和收穫的結果。

+1

在第二種情況下,你在技術上並沒有傳遞實例變量。 –

+0

@HotLicks好點,謝謝!我在底部添加了一個討論來詳細說明在第二種情況下應該怎麼做。 – dasblinkenlight

+0

我認爲當你談論對象時,「按值傳遞的語義」的東西會變得混亂。通過將一個對象引用傳入方法中,並讓該方法引用實例var,您不會改變修改該對象的事實將具有全局效果的事實。這個領域有時候讓新手們感到非常困惑。 –

0

這將取決於你如何使用它。如果您的課程使用頻率不高,那麼就不會有明顯的差異。

如果您使用的類實例很多,並且有很多線程,那麼在某些情況下,將它作爲參數傳遞會更快一些。

通常情況下,實例成員可以由類成員直接訪問,但不能使用靜態函數(由於顯而易見的原因)。

所以請按照您的編碼慣例,不要擔心。到時候它真的很重要,你會知道答案的核心。