Java
 Computer >> コンピューター >  >> プログラミング >> Java

Java 9で変更不可能なマップを作成するには?Map.of()とMap.ofEntries()の使い方

変更不可能なマップ(Unmodifiable Map)とは、一度インスタンスが生成されると、キー追加削除更新が一切できないマップのことです。Java 9では、Mapインターフェースに追加された静的ファクトリメソッド「Map.of()」「Map.ofEntries()」を使うことで、簡潔かつ安全に変更不可能なマップを作成できます。

これらのメソッドで作成されたマップには、以下のような特徴があります。

  • ファクトリメソッドが返すマップは慣習的にイミュータブル(不変)です。キーや値を追加・削除・更新することはできず、変更用メソッドを呼び出すとUnsupportedOperationExceptionがスローされます。
  • マップに格納されたキー/値そのものが可変(ミュータブル)である場合、マップの動作が不安定になったり、内容が変化して見えることがあります。
  • イミュータブルなマップはnullのキーや値を許容しません。nullを使って作成しようとするとNullPointerExceptionがスローされます。
  • 重複するキーは作成の時点で拒否されます。静的ファクトリメソッドに重複キーを渡すとIllegalArgumentExceptionがスローされます。
  • すべてのキーと値がシリアライズ可能であれば、イミュータブルなマップもシリアライズ可能です。
  • エントリの反復処理の順序は規定されておらず、変更される可能性があります。

構文

Map.of(k1, v1, k2, v2)
Map.ofEntries(entry(k1, v1), entry(k2, v2), ...)

なお、Map.of()は最大10組のキーと値までしか受け付けません。それ以上のエントリを持つマップを作成したい場合は、Map.ofEntries()を使用します。

Map.of()の使用例

import java.util.Map;

public class UnmodifiableMapTest {
    public static void main(String[] args) {
        Map<String, String> empMap = Map.of("101", "Raja", "102", "Adithya", "103", "Jai", "104", "Chaitanya");
        System.out.println("empMap - " + empMap);
        empMap.put("105", "Vamsi");    // UnsupportedOperationExceptionがスローされる
    }
}

実行結果

empMap - {104=Chaitanya, 103=Jai, 102=Adithya, 101=Raja}
Exception in thread "main" java.lang.UnsupportedOperationException
        at java.base/java.util.ImmutableCollections.uoe(Unknown Source)
        at java.base/java.util.ImmutableCollections$AbstractImmutableMap.put(Unknown Source)
        at UnmodifiableMapTest.main(UnmodifiableMapTest.java:7)

このように、変更不可能なマップに対してput()などの変更操作を行おうとすると、コンパイルは通りますが実行時にUnsupportedOperationExceptionが発生します。

Map.ofEntries()の使用例

import java.util.Map;
import static java.util.Map.entry;

public class UnmodifiableMapTest {
    public static void main(String[] args) {
        Map<String, String> empMap = Map.ofEntries(
            entry("101", "Raja"),
            entry("102", "Adithya"),
            entry("103", "Jai"),
            entry("104", "Chaitanya")
        );
        System.out.println("empMap - " + empMap);
    }
}

実行結果

empMap - {102=Adithya, 101=Raja, 104=Chaitanya, 103=Jai}

Map.ofEntries()entry()メソッドで生成したエントリを引数として渡すため、エントリ数の制限を受けずに柔軟にマップを構築できます。読み取り専用の定数的なデータを扱いたい場合に、両メソッドは非常に便利です。

  1. JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説

    JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー

  2. Javaでログインフォームを作成する方法!Swingを使った実装例とサンプルコード

    JavaではSwingというGUIツールキットを利用することで、デスクトップアプリケーション向けのログインフォームを簡単に開発できます。この記事では、ユーザー名(User Name)とパスワード(Password)の2つのラベル、認証情報を入力するための2つのテキストフィールド、そしてSUBMIT(送信)ボタンを1つ備えたフォームを作成します。正しい認証情報が入力されると、フォーム上に「Hello admin」というメッセージが表示されます。 使用する主なコンポーネント JLabel:ラベルの表示に使用します。 JTextField:ユーザー名の入力欄です。 JPasswordField: