2015-11-19 7 views
6

ArrayList <のようなオブジェクトの初期化に違いがあり、フィールドの宣言またはコンストラクタに不具合があるかどうかは疑問でした。コンストラクタまたはフィールド宣言のリストの初期化

メモリの使用量、性能などに違いはありますか、まったく同じですか?

オプション1:

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

オプション2:

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

それは愚かな質問、または非常に基本的なものかもしれませんが、私は最初から構築したい、私は理解したいです私が見るものすべて。

答えて

1

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

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

0

は値を初期化する方法は他にもあります。このDefault constructor vs. inline field initialization

を見てみましょう:https://docs.oracle.com/javase/tutorial/java/javaOO/initial.html

私見は、あなたがそれはあなたが持っている唯一のコンストラクタであることを確認しない限り、デフォルトコンストラクタで初期化することはもう少し危険です。複数ある場合は、常にデフォルト(良い方法)を呼び出すか、初期化コードを複製する必要があります。

2

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

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

は考えてみましょう:

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

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

関連する問題