2014-09-26 76 views
0

哪個更好?編程最佳實踐:初始化或不初始化

情況1:

set = new set<>(); 

if(flagEnabled) { 
    set = generateSet(); 
} 

update(set); 

情況2:

哪一個是可取?

+1

我要說不分配你不使用計劃內存。你只是在浪費垃圾收集器的時間。 – 2014-09-26 20:39:49

+2

'set = flagEnabled? generateSet():new set()'? – 2014-09-26 20:41:18

+1

'generateSet()'做什麼?你可以移動函數調用中的'if'語句,只需執行'set = generateSet()'? – 2014-09-26 20:41:26

回答

3

這兩個代碼示例之間沒有邏輯差異,但第一個示例可能涉及創建一個丟棄的新對象。爲了不創建不必要的對象,可以使用第二個示例,並使用if/else

0

要初始化的變量的Object其中的if-else statement.The最好的做法是將其初始化爲null執行後得到及時報廢,儘管它不是必需的,但分配一個對象,它是從來沒有使用過的純堆內存浪費

+0

但是如果有一個代碼路徑不使用變量,爲什麼declare該範圍內的變量呢? – 2014-09-26 20:44:13

2

第二部分在技術上會更好,因爲它可以節省一些可能不必要的對象創建,從而幫助垃圾收集器。這與懶惰實例化有關,這意味着只有在我們需要它們時纔在內存中實例化對象。

然而,從邏輯上講,這兩者是相同的。

這裏是讀好有關Lazy Instantiation

0

是否有人曾將要使用此代碼,或者如果你將要維護該代碼在相當長的時間週期,這將是更好地保持它的簡單並在您將其創建爲某個默認值時進行設置。

+0

「取決於你所處的語言」這個問題顯然標記爲Java。 – 2014-09-26 20:44:04

+0

我現在看到標籤,正在看遍各地,除了我需要的權利! – 2014-09-26 20:45:17

5

選擇第二種情況:在您的代碼中存在一個路徑,其中創建的對象只能丟棄並替換爲另一個。

最好是無條件地初始化的對象,但:您可以通過選擇相應的選項與三元運算符,這樣做:

set s = flagEnabled ? generateSet() : new set(); 

條件邏輯保持在原位,但現在是結合初始化,使您的意圖更容易看到。

0

我會考慮移動generateSet()方法中的條件:

Set<T> generateSet() { 
    Set<T> theSet = new Set<>(); 

    if(flagEnabled) { 
     // do stuff 
    } 

    return theSet; 
} 

然後,你可以簡單地做

mySet = generateSet();