2014-01-13 69 views
-2

將類變量作爲參數傳遞給私有方法而不是簡單引用它們有什麼優缺點嗎?隨着我的類越來越長,我擔心未來的編碼器需要滾動到類的頂部來確定「foo」是什麼,所以我正考慮在調用方法時將它們作爲參數傳遞,但我不是當然,如果這會導致我不考慮其他問題。私有方法中的類變量

在短;是這樣的:

public class Foo { 

    private int number = 0; 

    public Foo(int startingNumber) { 
     this.number = startingNumber; 
    } 

    public int biggerNumber() { 
     return embiggenIt(number); 
    } 

    // ... Many lines of code ... 

    private int embiggenIt(int aNumber) { 
     return aNumber++; 
    } 
} 

任何比這更好或更壞:

public class Foo { 

    private int number = 0; 

    public Foo(int startingNumber) { 
     this.number = startingNumber; 
    } 

    public int biggerNumber() { 
     return embiggenIt(); 
    } 

    // ... Many lines of code ... 

    private int embiggenIt() { 
     return this.number++; 
    } 
} 

...如果是這樣,爲什麼?

編輯

好了,所以顯然我應該在這裏說明,我不關心改變類變量,我不知道爲什麼每個人都跳了這樣的結論;我沒有意識到我的例子太可怕了(儘管我匆忙地把它拍了下來)。在這個例子中,我關心的是運行該方法後的返回值(認爲函數式編程)。

這也許是一個更好的例子是什麼我談論:

public class Foo { 

    private static final int number = 0; 

    public Foo() { 
    } 

    public int biggerNumber() { 
     return embiggenIt(number); 
    } 

    // ... Many lines of code ... 

    private int embiggenIt(int aNumber) { 
     return aNumber +1; 
    } 
} 

V.S.

public class Foo { 

    private static final int number = 0; 

    public Foo() { 
    } 

    public int biggerNumber() { 
     return embiggenIt(); 
    } 

    // ... Many lines of code ... 

    private int embiggenIt() { 
     return this.number +1; 
    } 
} 

我會強調,變量不必是恆定的,但我補充說,只是要清楚,我不是有意改變變量(我的理解通過引用傳遞VS路過的價值,謝謝)。

既然我們更清楚一點,兩種方法是否有所作爲?你更喜歡看哪個?哪一個會讓你打破Jr.程序員的指關節?

+9

你是否明白這兩個代碼有不同的行爲? –

+0

請注意,一個原始類型將被傳遞_asp value_,與'object'相對,後者將被reference_傳遞。你的第一個例子將不會增加類成員。 –

+0

@XaviLópez偶對象引用是按值傳遞的。 –

回答

0

所以,我終於想通了回答我的問題。似乎其他人在不理解問題的情況下閱讀我的代碼,但我自己偶然發現了正確的答案。

將變量傳遞給方法比僅僅引用類變量更好,因爲它允許我們在測試時執行依賴注入。顯而易見的例外是類常量。

0

在第一種情況下,您傳遞的是價值。所以該類的成員變量永遠不會被修改。在第二種情況下,您正在引用類變量本身。

0

我會說它更糟糕,因爲它只會讓你頭痛,跟蹤範圍。例如,在您的第一個代碼中,類變量number的值不會增加,因爲您只會增加指向與aNumber不同的變量的本地字段aNumber的值。

0

首先,您的代碼示例將產生不同的結果 - 第一個不做任何事情,而第二個實際上只增加number。然而,兩者都返回變量的舊值(即沒有添加1),因爲您使用減量後運算符x++(而不是++x)。

其次,即使在大類文件中使用字段也沒有問題,如果您使用自解釋名稱。

第三,如果您想要將值分配給它,通常不可能省略使用該字段。

0

在Java中的本機類型如int,雙,...是按值

傳遞和任何類對象的被引用傳遞。

所以在你的代碼,你可以使用Integer類不是int