2016-08-15 9 views
3

Javaが初期化されていない変数をヌルに設定しているという(NO:herehereまたはhere ...)というSOの投稿が多く見受けられました。変数を使用する前に変数をnullに初期化する必要がありますか?

しかし、最近、私はGoogleの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); 

を私は、Googleのdeveloppersは何とか本当に資格があると仮定し、そのI私たちはまったく同じ範囲にあるので、疑問に思っています。第二のものの代わりに第一の方法を宣言することの長所と短所は何ですか?

+1

これは、スタイルの問題であり、プログラミングスタイルが企業の標準(または個人的な基準)に基づいてどのように見えるかということでした。それはもっと読みやすいかもしれません。しかし、結局のところ、この質問は私の目ではむしろ意見に基づいています。 – SomeJavaGuy

+3

それはそれらの記事が言っているものではありません。 Javaでは、初期化されていないメンバ変数と静的変数のみがnullに設定されます。これはローカル変数には当てはまりません。 – khelwood

+0

私は70年代にプログラムすることを学んだとき、私はPascalを使用していました。その言語では、変数の宣言をその使用から分離する必要がありました。私はまだ時々時々、スタイルが次第に変わっていくのを目の当たりにしています。 Javaのような最新のプログラミング言語では、私の個人的な好みは、Googleの開発者が最もよく認定されていることにどれほど合意しても、あなたのバージョンのGoogleにとっては明らかです。 –

答えて

7

これはスタイルの問題です。私は2つの理由で不必要に初期化していない:そう

  1. は、すべてのコントロールパスに初期化されていない変数が発生した場合、コンパイルは成功しないだろうとJavaコンパイラはあなたを与える余分なチェックを切り詰め。

  2. nullが参照のための許容値であるという印象を与えますが、しばしばそうではありません。

+8

3番目の点については、いくつかの 'ヌル'またはデフォルト値に初期化することで、それらの変数を 'final'にすることができなくなります – JonK

+3

私はnullに初期化しないことをお勧めする理由に同意します。あなたがnullに初期化したいかもしれない少なくとも1つの理由を指すことができるはずです。コンパイラが静的に推論できない明確な割り当て要件を満たすことを除いて、私は良い理由は考えられません。それはスタイルの問題ではなく、言葉の要件を満たすことです。 –

+0

可能な4番目の点として、変数が1つの可能なルートで初期化されていない 'if/else'ブロックで不完全な初期化が隠されます。コンパイラは、このような場合、事前の初期化をせずにコンパイル時エラーを発生させます。 – Tom

関連する問題