2017-07-26 65 views
3

我確實認爲自己在Java方面非常有經驗,但仍然存在一些我不太確定的小問題。Java:聲明和初始化的最佳實踐

我總是嘗試寫出可維護,易讀的代碼,並以最高的效率爲目標。 例如,我只在真正需要時才調用「新」操作符。

這是因爲我不想不必要地分配內存。 但支持變量呢?

很多人都傾向於來聲明一個String剛分配這樣一些長期的屁股方法調用:

字符串幫手= Class.method1()方法2(PARAM).getter();

我總是懷疑這是不是分配比需要更多的內存。 getter已經返回一個新的對象,現在通過引用它來分配更多的內存。 當我多次使用此getter時,輔助字符串很方便,但是如果只需要一次,直接傳遞該方法而不是聲明新變量會更好嗎? 這是否真的將內存分配給堆?對象a,b,c,d,e,f,g,h,i,j ...;以及對象a,b,c,d,e,f,g,h,i,j ...;

我希望一些比我更有經驗的Java人能告訴我他們是如何處理這樣的基本事情的。謝謝! :)

+1

在你的例子中,在_stack_上會使用更多的內存,而不是_heap_。這是一個很小的數目,不值得擔心。重要的是,通過給字符串一個有用的名字,你可以使你的代碼更加自我記錄,因此更具可讀性。 –

+0

「getter函數已經返回一個新的對象......」 - 不,通常情況下,如果它只是返回一個被調用對象成員的引用,就像大多數getter方法一樣。 – Jesper

+0

實際上更重要的是'Class.method1()。method2(param)。getter()'是公然違反[Demeter法](https://en.wikipedia.org/wiki/Law_of_Demeter)(最少知識原則),使得代碼與其依賴關係緊密結合,因此更加困難保持。 –

回答

0

如果只能通過訪問器(「setter」方法)設置成員,我更喜歡第一種樣式。它提供了一個提示,即初始化值是構造時的默認值。

如果可以在構造過程中指定成員,我通常會使用較少的參數將默認值從構造函數傳遞給適當的構造函數。例如,

final class Example { 

    private final String name; 

    Example() { 
    this("My Example"); 
    } 

    Example(String name) { 
    this.name = name; 
    } 

} 
1

這是否真的將內存分配給堆? 不,它被分配在堆棧上。全局變量分配在堆上。

當你的方法完成時,它將返回從堆棧中取出的分配的memoryspace,並且該變量不再有任何問題。

我一直在想,如果這不會分配更多的內存 它會分配堆棧上的內存以引用變量。如果您將函數作爲參數傳遞,則不需要此引用。但是,該功能仍需進行評估,並且返回值放置在堆棧上。如果你爲它聲明瞭一個變量,那麼必須執行一些額外的寫入和讀取操作,在大多數情況下,這對於當今高效的計算機來說應該沒有任何問題。