2016-08-15 67 views
3

我看到很多SO帖子,說Java將任何未初始化的變量設置爲null(如here,herehere ...)。我應該使用它們之前初始化我的變量爲空?

但最近,我去當這個代碼,谷歌here寫:

cur = cr.query(builder.build(), INSTANCE_PROJECTION, selection, selectionArgs, null); 
while (cur.moveToNext()) { 
    String title = null; 
    long eventID = 0; 
    long beginVal = 0; 

    // Get the field values 
    eventID = cur.getLong(PROJECTION_ID_INDEX); 
    beginVal = cur.getLong(PROJECTION_BEGIN_INDEX); 
    title = cur.getString(PROJECTION_TITLE_INDEX); 

    // Do something with the values. 
    ... 
} 

我真的寧願這樣:

// Get the field values 
long eventID = cur.getLong(PROJECTION_ID_INDEX); 
long beginVal = cur.getLong(PROJECTION_BEGIN_INDEX); 
String title = cur.getString(PROJECTION_TITLE_INDEX); 

我認爲谷歌developpers都弄好了真正合格的,所以我奇怪,因爲我們處在同一個範圍內:宣佈第一種方式而非第二種方式有什麼優缺點?

+1

我認爲這是一個風格問題,以及您的編程風格應該如何基於公司標準(甚至是個人標準)。它們可能對他們更易讀。但最終這個問題在我眼中是基於意見的。 – SomeJavaGuy

+3

這不是那些帖子說的。 Java只將未初始化的成員變量和靜態變量設置爲null。這不適用於局部變量。 – khelwood

+0

當我學會了在70年代編程時,我使用了Pascal,這是一種當時需要您將變量聲明與其使用分開的語言。我仍然有時會看到當時的風格正在延續(儘管越來越少)。在像Java這樣的現代編程語言中,無論我多麼認同Google開發人員通常非常合格,我個人的口味顯然是針對Google的版本。 –

回答

7

這是一個風格問題。我不爲兩個原因不必要的初始化:

  1. 這樣做則會覆蓋額外的檢查Java編譯器會給你,如果遇到未對所有的控制路徑初始化變量編譯不會成功。

  2. 它給人的印象是null是一個可以接受的值的參考,它往往不是。

+8

對於第三點,初始化爲'null'或默認值不允許使這些變量成爲'final' – JonK

+3

我同意你說爲什麼不建議初始化爲null的原因,但我認爲如果你聲稱「它是一個風格問題「你應該能夠指出至少一個你可能想要初始化爲null的原因。除了滿足編譯器無法靜態推斷的明確分配要求之外,我想不出一個好的理由;這不是風格問題,那是爲了滿足語言的要求。 –

+0

可能的第四點:這樣做會隱藏未在一個可能路由中初始化變量的if/else塊中的不完整初始化。在沒有預先初始化的情況下,編譯器會在這種情況下引發編譯時錯誤 – Tom

相關問題