Java「ダブルブレース初期化」の効率性?
StackаэтотвопросестьответынаStack Overflowнарусском:doubleтотакоеdouble braceинициализация? Javaの隠された機能トップの答えは言及ダブルブレースの初期化をして、非常に魅力的な構文: Set<String> flavors = new HashSet<String>() {{ add("vanilla"); add("strawberry"); add("chocolate"); add("butter pecan"); }}; このイディオムは、インスタンスの初期化子だけを含む匿名の内部クラスを作成します。これは、「包含スコープ内の[...]メソッドを使用できます」。 主な質問:これは想像以上に非効率ですか?その使用を1回限りの初期化に限定する必要がありますか?(そしてもちろん自慢して見せます!) 2番目の質問:新しいHashSetは、インスタンス初期化子で使用される「this」である必要があります...誰でもメカニズムに光を当てることができますか? 3番目の質問:このイディオムは、量産コードで使用するにはあいまいすぎますか? 概要:非常に良い答えです。皆さんに感謝します。質問(3)で、人々は構文が明確であるべきだと感じました(ただし、コードに慣れていない開発者にコードが渡される場合は特に、時々コメントをお勧めします)。 質問(1)では、生成されたコードはすぐに実行されます。余分な.classファイルが原因でjarファイルが乱雑になり、プログラムの起動がわずかに遅くなります(それを測定してくれた@coobirdに感謝します)。@Thiloは、ガベージコレクションが影響を受ける可能性があり、余分にロードされたクラスのメモリコストが場合によっては要因になる可能性があることを指摘しました。 質問(2)は私にとって最も興味深いものでした。答えを理解すると、DBIで起こっていることは、匿名の内部クラスがnew演算子によって構築されるオブジェクトのクラスを拡張しているため、構築されるインスタンスを参照する「this」値を持っていることです。とてもきちんとしています。 全体として、DBIは知的好奇心のようなものとして私を襲います。Coobirdなどは、Arrays.asList、varargsメソッド、Googleコレクション、および提案されたJava 7コレクションリテラルで同じ効果を達成できると指摘しています。Scala、JRuby、Groovyなどの新しいJVM言語も、リストの作成に簡潔な表記を提供し、Javaとうまく相互運用できます。DBIがクラスパスを混乱させ、クラスの読み込みを少し遅くし、コードを少しあいまいにすると、おそらく私はそれを避けます。しかし、私はこれをSCJPを取得したばかりの友人に頼み、Javaのセマンティクスについて素朴な冗談を愛するつもりです。;-) みんな、ありがとう! 2017年7月:Baeldung は二重ブレースの初期化の良い要約を持ち、アンチパターンと見なします。 2017年12月:@Basil Bourqueは、新しいJava 9では次のように言うことができると述べています。 Set<String> flavors = Set.of("vanilla", "strawberry", "chocolate", "butter pecan"); それは確かに行く方法です。以前のバージョンに行き詰まっている場合は、GoogleコレクションのImmutableSetをご覧ください。