9

Java プリミティブにはデフォルトの初期化値があることを理解しています。たとえば。0_int

私の調査によると、これらの値に依存するべきではないようです。常に明示的な初期化を提供する必要がありますか?もしそうなら、どこで?

これが私のプログラムの一部です:

public class Calculator {

// Initialize value where it's declared?
private int value;

public Calculator() {
    // Initialize value in constructor?
}

public void add(int other) {
    value += other;
}
}
4

7 に答える 7

4

Java によって生成されたデフォルト値を使用することはまったく問題ありません。インスタンスやstaticフィールドを明示的に初期化する必要はありませんclass。Java 言語仕様はこれを要求しているため、言語の実装は準拠する必要があります。つまり、メンバー変数のデフォルト値を使用すると、コードは 100% 移植可能のままになります。これは、プリミティブ型と参照型の両方に適用されます (後者は で初期化されますnull)。

詳細については、81 ページのJava 言語仕様を参照してください。

4.12.5 変数の初期値

プログラム内のすべての変数は、その値が使用される前に値を持っている必要があります。 - 各クラス変数、インスタンス変数、または配列コンポーネントは、作成時にデフォルト値で初期化されます。

明示的な初期化を提供する必要がある唯一のケースは、ローカル変数を宣言する場合です。

ローカル変数は、初期化または代入のいずれかによって使用する前に、明確な代入の規則を使用して検証できる方法で、明示的に値を指定する必要があります。

ただし、ローカルの初期化の失敗はコンパイル時エラーであるため、コンパイラーは、プログラムを実行する前に、不足しているすべての初期化を特定します。

于 2013-06-20T17:16:50.433 に答える
1

私の調査によると、これらの値に依存するべきではないようです。

あなたはそれらに頼ることができます。ご存知のようにデフォルトで行われるため、害はありません。

常に明示的な初期化を提供する必要がありますか?もしそうなら、どこで?

プリミティブの場合、明示的な初期化を提供する必要はありません。私はそうしないことを好みます。int i = 0;たとえば、変数のような初期化を行う人はめったにいません。ただし、ローカル変数について話している場合は、明示的な値を与える必要があります。デフォルトは暗黙的ではありません。

ただし、非プリミティブの場合は、値がデフォルトnullで であるため、宣言の時点またはコンストラクター内で明示的な初期化を行う必要がありますNPE。宣言の時点で初期化する利点は、各コンストラクターに初期化を入れる必要がないことです。

于 2013-06-20T17:16:46.467 に答える
0

原則として、作成するコードは常に可能な限り驚くべきことを行わないようにする必要があります。明示的に初期化されていない変数のデフォルトのゼロが驚くべきものであると思われる場合は、初期値がゼロであっても常に初期値を割り当てるようにする必要があります。

あなたが示したコードでの私の個人的な好みは、宣言時に変数を 0 に初期化することです。これは単純に、変数に対する最初の演算が+=そうであり、数値演算のデフォルト値に依存するのは間違っていると感じるからです。これには正当な理由はありません。問題なく動作するため、気分が悪いだけです。

于 2013-06-20T17:21:37.923 に答える
0

デフォルト値での JVM プリミティブの初期化を明らかに信頼できます。


ところで、明示的な初期化は、この場合は役に立たないバイトコードに変換されます。

このクラスがあるとします:

public class PrimitiveInitialization {
    int i = 0;
    int j;
}

対応するバイトコードは

class PrimitiveInitialization {
  I i
  I j

  public <init>()V
   L0
    LINENUMBER 8 L0
    ALOAD 0
    INVOKESPECIAL java/lang/Object.<init> ()V
   L1
    LINENUMBER 10 L1
    ALOAD 0
    ICONST_0
    PUTFIELD PrimitiveInitialization.i : I
    RETURN
   L2
    LOCALVARIABLE this LPrimitiveInitialization; L0 L2 0
    MAXSTACK = 2
    MAXLOCALS = 1
}

明示的な初期化により、 variable のバイトコード操作がほとんど追加されないことがわかりますi

とはいえ、JIT はおそらく実行時にこの種のバイトコードを最適化できるため、常にコードの可読性を優先する必要があります。

于 2013-06-20T17:36:29.257 に答える
0

これが本当に心配な場合は、コンストラクターで変数を初期化してください。ただし、ゼロ以外に初期化された数値プリミティブは見たことがありません。

カスタムの(そして貧弱な)JVMを使用している場合にのみ、これについて心配する必要があると思います。

于 2013-06-20T17:16:37.013 に答える
0

メンバー変数はデフォルト値で初期化されます。そのため、心配する必要はありません。ただし、デフォルト値またはその他の値で初期化したい場合は、コンストラクターで設定できます

于 2013-06-20T17:16:54.560 に答える