2016-01-25 43 views
2

可能看起來像一個愚蠢的問題。我只是想知道哪種編碼更好。這是更好的編碼方式

選項1:

if(a==null) { 
    a=getA(); 
    return a; 
} else { 
    return a; 
} 

選項2:

if(a==null) { 
    a=getA(); 
} 
return a; 

變量a是用於緩存的木屐()和避免調用它多次一個靜態變量。

+0

你忘記了第二個例子中的條件嗎? – Hexaholic

+0

對不起....我已經添加了它 –

+0

似乎主要是基於意見(我寧願選項2) – ctst

回答

6

還有這是更短的第3選擇 - 使用三元條件運算符:

return a != null ? a : getA(); 

編輯:我認爲a是一個局部變量,因此沒有被分配,如果是null。另一方面,如果它是一個用作緩存的實例變量(爲了避免多次調用getA()),您需要將getA()的結果分配給a,在這種情況下,我會使用第二種替代方法,因爲它更短,並因此更清晰(您仍然可以使用三元條件運算符 - return a != null ? a : (a = getA()); - 但我覺得不太清楚)。

+0

我認爲這將始終調用getA()方法。 getA()是一個巨大的方法,並且佔用大量資源並始終返回相同的輸出。 –

+0

不,事實並非如此:Java中只評估三元條件中的一個替代方案。 (也就是VB6中的'iif',它可以評估兩邊)。 – Bathsheba

+0

儘管我喜歡這種風格,但可能很重要的一點是getA()的值存儲在初始請求中,但不在此解決方案中。我們不知道哪裏來的,也不知道後來用什麼。 – cvesters

0

第二個更簡潔,可能因爲這個更好,但這是一個主觀問題,沒有人能給你一個特別客觀的答案。無論您喜歡或適合您的團隊編碼標準,都是答案。

正如已經指出的那樣,有一個較短的方式做到這一點:

return a!=null ? a : getA(); 

但同樣,這完全取決於你和你的團隊喜歡什麼。我個人更喜歡第二種方式,因爲它更具可讀性(在我看來)。

+0

但它不存儲getA()的值,如果我沒有錯。每次調用getA()都會浪費資源 –

1

我更喜歡第二種選擇,因爲只有一個return聲明,這可以幫助調試(您只需要放入一個斷點而不是兩個)。你也可以在第一個選擇中重複代碼。

但是在這種情況下我更喜歡使用三元條件:

return a == null ? getA() : a;

0

我假設一秒鐘即a是類成員和getA()是創建實例的方法a

最好的解決方案應該是在被調用的方法中推送這個邏輯。換句話說,而不是有:

void someFunction() { 
    // logic 
    if(a==null) { 
     a=getA(); 
    } 
    return a; 
} 

A getA() { 
    // creation logic of instance A 
    return newAInstance; 
} 

你應該有:

void someFunction() { 
    // logic 

    return getA(); 
} 

A getA() { 
    if(a == null) { 
     // creation logic of instance A 
    } 
    return a; 
} 

方法調用的成本是最小的,值得不必處理a將被實例化。

+0

感謝您的建議......但我沒有修改getA()方法的訪問權限.FYI,getA()方法實際上給了我一個巨大的hashmap。 –

+0

@NitishVasu你可以在你自己的類中包裝A類,只有在它尚未加載時纔會調用super.getA()。考慮一下。 ;) – Neil

1

我更喜歡第二種選擇,最佳做法是在方法中只有一個返回語句。這將是更可讀的代碼。

相關問題