Java 9のSet.of()メソッドで不変(イミュータブル)なSetを作成する方法
Java 9では、静的ファクトリメソッドSet.of()を使用することで、変更不可能(イミュータブル)なセットを簡潔に作成できます。従来のようにCollections.unmodifiableSet()でラップする必要がなく、1行のコードで安全なコレクションを生成できるのが大きな魅力です。
Set.of()メソッドで作成されたセットのインスタンスには、以下のような特徴があります。
- ファクトリメソッドが返すセットは慣例としてイミュータブル(不変)です。つまり、要素の追加・削除・置換は一切できません。セットに対してミューテーター(変更)メソッドを呼び出すと、UnsupportedOperationExceptionがスローされます。
- セットに格納された要素自体がミュータブル(可変)である場合、セットの内容が変化したように見えることがあります。
- イミュータブルなセットは、null要素を許容しない静的ファクトリメソッドによって作成されます。null要素を含めて作成しようとすると、NullPointerExceptionがスローされます。
- イミュータブルなセットの作成時には重複要素が拒否されます。静的ファクトリメソッドに重複する要素を渡すと、IllegalArgumentExceptionがスローされます。
- セット要素の反復順序は未指定であり、将来のバージョンで変更される可能性があります。
構文
Set.of(E... elements)
使用例
import java.util.Set;
public class SetOfMethodTest {
public static void main(String args[]) {
Set<String> names = Set.of("Adithya", "Bhavish", "Chaitanya", "Jai");
System.out.println("Names - " + names);
names.add("Raja"); // UnsupportedOperationException がスローされる
}
}
実行結果
Names - [Bhavish, Adithya, Jai, Chaitanya]
Exception in thread "main" java.lang.UnsupportedOperationException
at java.base/java.util.ImmutableCollections.uoe(Unknown Source)
at java.base/java.util.ImmutableCollections$AbstractImmutableSet.add(Unknown Source)
at SetOfMethodTest.main(SetOfMethodTest.java:8)
このように、Set.of()で作成したセットに対してadd()などの変更操作を行おうとすると、コンパイルは通っても実行時にUnsupportedOperationExceptionが発生します。読み取り専用のコレクションが必要な場面では、このメソッドを活用することで、意図しない変更からデータを保護し、より堅牢なコードを実現できます。
-
JavaのJToggleButton実装ガイド:ON/OFF切替ボタンの作り方を解説
JToggleButtonとは JToggleButtonはAbstractButtonを拡張したクラスで、クリックするたびにONとOFFが切り替わるトグルボタンを実現するために使用されます。通常のボタンと異なり、押した状態を保持できるのが特徴です。 JToggleButtonの主な特徴 最初に押されたときは押し込まれた状態のままとなり、もう一度押してはじめて元の状態(押されていない状態)に戻ります。 ボタンが押されるたびにActionEventが発生します。 さらに、JToggleButtonはItemEventも発生させることができます。このイベントは、選択状態という概念を持つコンポー
-
Javaでログインフォームを作成する方法!Swingを使った実装例とサンプルコード
JavaではSwingというGUIツールキットを利用することで、デスクトップアプリケーション向けのログインフォームを簡単に開発できます。この記事では、ユーザー名(User Name)とパスワード(Password)の2つのラベル、認証情報を入力するための2つのテキストフィールド、そしてSUBMIT(送信)ボタンを1つ備えたフォームを作成します。正しい認証情報が入力されると、フォーム上に「Hello admin」というメッセージが表示されます。 使用する主なコンポーネント JLabel:ラベルの表示に使用します。 JTextField:ユーザー名の入力欄です。 JPasswordField: