2017-12-19 6 views
0

私はCとC#からJavaを学んでいますが、静的なオブジェクトリストを以下に示すよりも簡潔な方法で初期化することができないのだろうか?静的にオブジェクトを初期化する最も簡潔な方法リスト

本質的に単純な構造型であるため、Partのコンストラクタを作成して繰り返し使用するのは面倒です。

class Widget { 

    private static class Part { 
     public String number; 
     public String description; 

     Part(String number, String description) 
     { 
      // a constructor just to initialize public fields? ugh 
      this.number = number; 
      this.description = description; 
     } 
    } 

    private static final List<Part> parts = List.of(
     new Part("ABC", "Doo-hickey"), // < seems overwrought 
     new Part("DEF", "whadjamacalit"), 
     new Part("HIJ", "thing-a-ma-bob"), 
     // ... 
    ); 

    // ... 
} 
+0

文字列を配列に配置し、ループ内にパーツを作成することができます。 – khelwood

+0

実行時にリストを変更する予定がない場合は、 'Enum'を使うことができます。 – Izruo

答えて

3

私は、Javaの学習CおよびC#から来る、と は、以下に示す であるよりも、オブジェクトの静的リストを初期化するために、より簡潔な方法が存在しない場合は思ったんだけど?

同様の冗長性のいくつかの選択肢がありますが、あなたの主な異議がnew演算子の使用とクラス名の出席繰り返しにあるように思わ限り、ノー、これらまたは回避するための方法はありません同等。特に、Javaには複合型オブジェクトのCスタイルイニシャライザの直接の類似点はありません。

あなたは、具体的にはnewとコンストラクタを使用する代わりに、「等価物」のためのちょっとした揺らぎの部屋を残しておきました。実際に必要とされるのは、単に静的コンテキストで評価できる適切な型の式です。 new演算子を使用する最も顕著な代替案は、適切な静的メソッドの呼び出し、または静的にアクセス可能なオブジェクトのインスタンスメソッドの呼び出しです。

Partのコンストラクタ を作成して繰り返し使用することは面倒です。本質的に単純な構造型です。

Javaでは、このように参照タイプの異なるフレーバーを区別しません。実際には、クラスPartのメソッドは定義されていませんが、それはまだObjectから継承されたメソッドを持っています。その意味では、単純な構造型には似ていません。 List<Part>Partのサブクラスのインスタンスを含むことができることも

注ので、Javaコンパイラの局部的な観点から、すべての要素が、具体的クラスPartのでなければならないことは明らかではありません。 Javaはこれを前提としている可能性がありますが、そうしない方が簡単です。いくつかの余分な文字は私の視点からはあまり重要ではありません。

2

あなたはおそらくC#のからのようなものをやって考えている:大きなオブジェクトを初期化するときに、痛みであるジャワ、中にはできません

new List<Part> { 
    new {"ABC", "Doo-hickey"}, 
    new {"DEF", "whadjamacalit"} 
} 

を。 Partに添付されている工場の方法で逃げることができます。何かPart.make("ABC", "Doo-hickey")のようなものです。この場合は入力を保存することはできませんが、より複雑なケースではおそらくです。

関連する問題