ぺんぎんらぼ

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です。たまに絵を描きます。

お笑いとマンガ好きなしょぼしょぼWeb系エンジニアの日記です

Java Tips - Setの初期化

java.util.Setオブジェクトの初期化方法いろいろです。

addメソッドを使って初期化

基本ですね。初期化する要素ごとにSetインターフェースのaddメソッドを使用して初期化します。

Set<String> fruits = new HashSet<>();
fruits.add("apple");
fruits.add("orange");
fruits.add("grape");

コンストラクタを使って初期化

Setインターフェースを実装したクラスはコンストラクタの引数にCollectionが指定でき、指定したCollectionで初期化されたオブジェクトが生成できます。
ArraysクラスのasListメソッドを使用してListを生成し、そのListをSetの実装クラスのコンストラクタに渡すことで初期化します。

Set<String> fruits = new HashSet(Arrays.asList("apple", "orange", "grape"));

初期化されたSetを生成するメソッドは、後で説明するSet.ofメソッドしかありません。Set.ofメソッドはJava9以降でしか使用できないので、Java8以前では、

  1. ArraysクラスのasListメソッドを使用してListを生成
  2. 生成したListオブジェクトを使って、Setを生成

と、このようにひと手間ある初期化方法になります。

インスタンスイニシャライザを使って初期化

あまり知られていませんが、インスタンスイニシャライザというものを使うことで初期化コードを書くことができます。
インスタンスイニシャライザ内でaddメソッドを使用して初期化します。 いくつか注意点があります。

  • addメソッドを使うときに、オブジェクトは指定せず、単に「add("~")」と記述します。
  • HashSetは、Serializableインターフェースを実装しているので、シリアルバージョンIDを定義しないと、IDE上で警告が表示されます。
Set<String> fruits = new HashSet<>() {
    private static final long serialVersionUID = 1L;
    {
        add("apple");
        add("orange");
        add("grape");
    }
};

利点が少ないので、この記法をとることは少ないでしょう。
また、インスタンスイニシャライザはSonar cubeでcode smell「Only static class initializers should be used」として検出されてしまいます。
このことからも、インスタンスイニシャライザを積極的に使用する意味はないでしょう。

Set.ofを使って初期化

Java9で追加されたSetインターフェースのofメソッドを使用して初期化します。

Set<String> fruits = Set.of("apple", "orange", "grape");

この初期化方法は変更不可能なSetが生成されるので、変更する場合は、実装クラスのインスタンスを生成して、引数にSet.ofメソッドで生成したSetオブジェクトを指定します。