Javaダブルブレースの初期化

1概要

この簡単なチュートリアルでは、単一のJava式でオブジェクトを作成および初期化するために二重括弧をどのように使用できるかを示します。

この手法がアンチパターンと見なされる理由についても説明します。

2標準的なアプローチ

通常、次のように一連の国を初期化して設定します。

@Test
public void whenInitializeSetWithoutDoubleBraces__containsElements() {
    Set<String> countries = new HashSet<String>();
    countries.add("India");
    countries.add("USSR");
    countries.add("USA");

    assertTrue(countries.contains("India"));
}

上記の例からわかるように、次のことを行っています。

  1. HashSet のインスタンスを作成します

  2. HashSet に国を追加

  3. 最後に、国が HashSet に存在するかどうかを主張します.

3ダブルブレースを使う

しかし、実際には作成と初期化を1つのステートメントにまとめることができます。これが二重括弧を使うところです。

@Test
public void whenInitializeSetWithDoubleBraces__containsElements() {
    Set<String> countries = new HashSet<String>() {
        {
           add("India");
           add("USSR");
           add("USA");
        }
    };

    assertTrue(countries.contains("India"));
}

上記の例からわかるように、次のとおりです。

  1. HashSet を拡張する無名インナークラスを作成する

  2. addを呼び出すインスタンス初期化ブロックを提供する

メソッドを使用し、 HashSet に国名を追加します。 。最後に、国が HashSet に存在するかどうかを主張できます。

4二重中括弧を使用する利点

二重中括弧を使用することにはいくつかの簡単な利点があります。

  • ネイティブの作成方法に比べてコードの行数が少ない

初期化 ** コードはもっと読みやすいです

  • 作成初期化は同じ式で行われます

5二重中括弧を使用することの欠点

二重中括弧を使用することの欠点は次のとおりです。

不明瞭、初期化を行うための広く知られた方法

  • 使用するたびに余分なクラスが作成されます

  • 「ダイヤモンド演算子」の使用をサポートしていません - 機能

Java 7で導入された ** 拡張しようとしているクラスが final とマークされている場合は動作しません。

  • 囲むインスタンスへの隠された参照を保持します。

メモリリーク

二重括弧の初期化がアンチパターンと見なされるのは、これらの不都合のためです。

6. 代替案

6.1. ストリームファクトリメソッド

代わりに、 Set を初期化するために新しいJava 8 Stream APIをうまく利用できます。

@Test
public void whenInitializeUnmodifiableSetWithDoubleBrace__containsElements() {
    Set<String> countries = Stream.of("India", "USSR", "USA")
      .collect(collectingAndThen(toSet(), Collections::unmodifiableSet));

    assertTrue(countries.contains("India"));
}

6.2. Java 9コレクションファクトリメソッド

また、Java 9では、次のことを可能にする一連の便利なファクトリメソッドが用意されています。

List<String> list = List.of("India", "USSR", "USA");
Set<String> set = Set.of("India", "USSR", "USA");

このリンクについてもっと読むことができます:/java-9-collections-factory-methods[この記事の中に]

7. 結論

この簡潔なチュートリアルでは、二重中括弧の使い方とその長所と短所について説明しました。

これらの例の実装はhttps://github.com/eugenp/tutorials/tree/master/core-java-lang-syntax[GitHubプロジェクト]にあります。そのままインポートして実行するのは簡単です。