可能看起來像一個愚蠢的問題。我只是想知道哪種編碼更好。這是更好的編碼方式
選項1:
if(a==null) {
a=getA();
return a;
} else {
return a;
}
選項2:
if(a==null) {
a=getA();
}
return a;
變量a是用於緩存的木屐()和避免調用它多次一個靜態變量。
可能看起來像一個愚蠢的問題。我只是想知道哪種編碼更好。這是更好的編碼方式
選項1:
if(a==null) {
a=getA();
return a;
} else {
return a;
}
選項2:
if(a==null) {
a=getA();
}
return a;
變量a是用於緩存的木屐()和避免調用它多次一個靜態變量。
還有這是更短的第3選擇 - 使用三元條件運算符:
return a != null ? a : getA();
編輯:我認爲a
是一個局部變量,因此沒有被分配,如果是null
。另一方面,如果它是一個用作緩存的實例變量(爲了避免多次調用getA()
),您需要將getA()
的結果分配給a
,在這種情況下,我會使用第二種替代方法,因爲它更短,並因此更清晰(您仍然可以使用三元條件運算符 - return a != null ? a : (a = getA());
- 但我覺得不太清楚)。
第二個更簡潔,可能因爲這個更好,但這是一個主觀問題,沒有人能給你一個特別客觀的答案。無論您喜歡或適合您的團隊編碼標準,都是答案。
正如已經指出的那樣,有一個較短的方式做到這一點:
return a!=null ? a : getA();
但同樣,這完全取決於你和你的團隊喜歡什麼。我個人更喜歡第二種方式,因爲它更具可讀性(在我看來)。
但它不存儲getA()的值,如果我沒有錯。每次調用getA()都會浪費資源 –
我更喜歡第二種選擇,因爲只有一個return
聲明,這可以幫助調試(您只需要放入一個斷點而不是兩個)。你也可以在第一個選擇中重複代碼。
但是在這種情況下我更喜歡使用三元條件:
return a == null ? getA() : a;
我假設一秒鐘即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
將被實例化。
感謝您的建議......但我沒有修改getA()方法的訪問權限.FYI,getA()方法實際上給了我一個巨大的hashmap。 –
@NitishVasu你可以在你自己的類中包裝A類,只有在它尚未加載時纔會調用super.getA()。考慮一下。 ;) – Neil
我更喜歡第二種選擇,最佳做法是在方法中只有一個返回語句。這將是更可讀的代碼。
你忘記了第二個例子中的條件嗎? – Hexaholic
對不起....我已經添加了它 –
似乎主要是基於意見(我寧願選項2) – ctst