web-dev-qa-db-ja.com

コンストラクターまたはフィールド宣言でリストを初期化しています

ArrayList <>のようなオブジェクトの初期化と、フィールド宣言またはコンストラクターの要素との違いに疑問があるのですが。

メモリ使用量、パフォーマンスなどに違いはありますか、それともまったく同じですか?

オプション1:

class MyClass {
     private List<String> strings = new ArrayList<String>();
}

オプション2:

class MyClass {
    private List<String> strings;
    public MyClass() {
        strings = new ArrayList<String>();
    }
}

ばかげた質問かもしれませんし、非常に基本的な質問かもしれませんが、私は最初から構築するのが好きです。

13
Jankosha

違いがあります:when初期化が発生します。フィールドが最初に初期化され、次にコンストラクターが起動します。

自明な例では、実際的な違いはありませんが、初期化のために別のフィールドがListフィールドに依存している場合、コンストラクターのバージョンはNPEで爆発します。

検討してください:

 private List<String> strings = Arrays.asList("foo", "bar");
 private String stringsDescription = strings.toString();

stringsの初期化をコンストラクターに移動した場合、stringsDescriptionの初期化はNPEで爆発します。

7
Bohemian

それは本質的に同じことです。コンストラクターでそれを行うと、それをより詳細に制御できます(たとえば、コンストラクターが異なれば、実行できることも異なります)が、最終結果は同じです。

メモリ、CPU、またはその他の方法でパフォーマンスに違いはありません。

3
Tim B

これを見てください デフォルトコンストラクターとインラインフィールドの初期化

値を初期化する他の方法もあります: https://docs.Oracle.com/javase/tutorial/Java/javaOO/initial.html

私見、デフォルトコンストラクターでの初期化は、それが唯一のコンストラクターであることが確実でない限り、少し危険です。複数ある場合は、常にデフォルトを呼び出すか(グッドプラクティス)、初期化コードを複製する必要があります。

1
Gervasio Amy