2016-04-26 10 views
6

、0またはしないように、変数の初期化の違いは何ですか?いくつかのコンパイラでは、フィールドを初期化しない限り比較はできません。しかし、ここではそうではありません。これは最適化と関係がありますか?あるいはこれはちょうど矛盾した/悪いコーディングの練習ですか?intを0に初期化するかどうかを指定します。私は、彼らがJavaでは</p> <pre><code>protected int mPaddingRight = 0; protected int mPaddingLeft = 0; protected int mPaddingTop; protected int mPaddingBottom; </code></pre> <p>として4つの変数を定義する参照アンドロイドのソースコードで

+2

違いはありません - intメンバーはデフォルトでゼロに初期化されます。 –

+1

私はそれらを0にしたければ、私はまだ '0'に初期化します。そして私はそれをするので、あなたもそうするべきです! – Gendarme

答えて

8

Java primitive data types turorialによれば、すべてのプリミティブデータ型はデフォルト値を持ちます。初期化は暗黙のうちに行われます。予期しない動作を防ぐために使用する前に値を初期化することをお勧めします。

byte 0 
short 0 
int 0 
long 0L 
float 0.0f 
double 0.0d 
char '\u0000' 
String (or any object)  null 
boolean false 
+0

うわー、すばらしい答えがたくさんあります。だから私は最も古いものを選び、他の人は投票する。 –

1

コメント欄で述べたように、なし差がありません。それらは0で暗黙的に初期化されます。しかし、良いIDEを使用したり、他のツールを持っているなら、= 0;を検索して置き換えて= SomeOtherValueHere;に置き換えてください。

また、変数にアクセスする前に常に変数を初期化することをお勧めします。

1

変数を初期化するのは良いコーディングです。 Oracleのドキュメントから

これは、フィールドが宣言されたときに値を代入することは必ずしも必要ではないのです。 宣言されているが初期化されていないフィールドは、コンパイラによって適切なデフォルト値 に設定されます。一般的に言えば、このデフォルトの は、データ型に応じてゼロまたはヌルになります。しかし、そのような のデフォルト値に頼っているのは、一般的に悪いプログラミングであると考えられます。 。以下の通りです変数を初期化する

メリット:

  1. は、それが簡単にあなたのコード
  2. に従うことをしますが、静的解析ツールのために楽にします。
  3. 普及しているデザインパターンのほとんどは、変数をデフォルト値に初期化するように要求します。そのため、プログラマは変数がどの値に初期化されているかを正確に知ることができます。
  4. プログラムの後半で未定義の動作を防ぐために、変数を初期化することをお勧めします。
  5. 変数を初期化するとデバッグが容易になります。
+0

Hmm。ここには「未定義の振る舞い」はありません。すべて明確に指定されています。静的解析ツールもそれに対応できます。 – Thilo

0

他の人は、クラスプロパティがデフォルト値に初期化されていることを指摘しています。

あなたが0に明示的に設定するのであれば、意味的に、違いはありません(オブジェクトプロパティのために、nullにそれらを設定したり、。)

しかし、実際にはバイトコードレベルでの違いがあるかもしれません。暗黙的または明示的にデフォルト値に設定されているクラスプロパティでのみ異なるコードがまったく同じバイトコードを持つという保証はありません。

JDKの以前のバージョンでは、明示的な初期化のために大きくて長いコードを生成するために使用されました。これはjavapで確認するのが簡単でした。 (この事実は、インタビューの質問の基礎として時折使用されていました。)これがまだそうであるかどうかを確認するためにJDKの最新バージョンをチェックしていません。

+0

この方法でクラスプロパティを初期化する必要があるかどうかは、既に知られている既定値であっても、これは神聖な戦争領域に踏み込んでいます。私の気持ちは、明示的なデフォルトイニシャライザはノイズであり、省略しなければならないということです。プロパティにデフォルト以外のイニシャライザが必要で、デザインに静的なイニシャライザやコンストラクタが必要ない場合は、なぜ魔法の値が使用されているのかというコメントがある限り、これを行うことができます。それでも、私が働いたすべてのJavaショップは決してこれをしませんでした。これらのC#の開発者は、すべての_を初期化します。 – jdv

+0

明確な初期化のためのより長いコード?私はJavaを知っていると思った:D –