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

【Java入門】ArrayListを読み取り専用(変更不可)にする方法

はじめに

JavaでArrayListの内容を外部から勝手に変更されたくない場合、読み取り専用(変更不可)のリストとして扱いたい場面があります。そんなときに活躍するのが、java.util.Collectionsクラスが提供するunmodifiableList()メソッドです。

このメソッドはListインターフェースを実装したオブジェクト(ArrayListなど)を引数として受け取り、その変更不可(unmodifiable)なビューを返します。取得したリストに対して、呼び出し側ができるのは読み取り操作のみで、要素の追加や削除は一切できません。

基本的な使い方

以下のサンプルプログラムでは、ArrayListオブジェクトを生成して要素を追加し、それを読み取り専用のListオブジェクトへ変換しています。

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ArrayListReadOnly {
    public static void main(String[] args) {
        // ArrayListオブジェクトのインスタンス化
        ArrayList<String> list = new ArrayList<String>();
        list.add("JavaFx");
        list.add("Java");
        list.add("WebGL");
        list.add("OpenCV");

        System.out.println(list);

        // ArrayListを読み取り専用リストに変換
        List<String> myList = Collections.unmodifiableList(list);
        System.out.println("読み取り専用に変換後: " + myList);
    }
}

実行結果

[JavaFx, Java, WebGL, OpenCV]
読み取り専用に変換後: [JavaFx, Java, WebGL, OpenCV]

このように、Collections.unmodifiableList()を使うことで、元のArrayListの中身を持つ読み取り専用のビューを簡単に作成できます。

変更しようとするとどうなる?

読み取り専用のリストを取得した後は、その内容を変更することはできません。つまり、add()やremove()などのメソッドによる直接の変更はもちろん、Iterator経由での要素追加・削除も不可です。これらの操作を行おうとすると、実行時にUnsupportedOperationExceptionがスローされます。

例外が発生する例

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class ArrayListReadOnly {
    public static void main(String[] args) {
        // ArrayListオブジェクトのインスタンス化
        ArrayList<String> list = new ArrayList<String>();
        list.add("JavaFx");
        list.add("Java");
        list.add("WebGL");
        list.add("OpenCV");

        System.out.println(list);

        // ArrayListを読み取り専用リストに変換
        List<String> myList = Collections.unmodifiableList(list);

        // 変更不可のリストに要素を追加しようとする
        myList.add("CoffeeScript");
        System.out.println("読み取り専用に変換後: " + myList);
    }
}

実行時例外

[JavaFx, Java, WebGL, OpenCV]
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableCollection.add(Unknown Source)
    at SEPTEMBER.remaining.ArrayListReadOnly.main(ArrayListReadOnly.java:20)

注意点

  • unmodifiableList()は「ビュー」を返すだけなので、元のArrayList自体を変更すると、読み取り専用リストの内容も連動して変わります。完全に独立させたい場合は、新しいリストにコピーしてから渡しましょう。
  • コンパイルエラーではなく実行時例外として検出されるため、変更操作を誤っていてもコンパイル時には気づきません。
  • Java 9以降では、List.of()を使うことでもイミュータブル(不変)なリストを簡潔に作成できます。

まとめ

ArrayListを読み取り専用にしたい場合は、Collections.unmodifiableList()メソッドを使用します。これにより、リストへの意図しない変更を防ぎ、プログラムの安全性と堅牢性を高めることができます。ただし、変更操作を行うとUnsupportedOperationExceptionが発生する点や、元のリストとの連動性には注意が必要です。

  1. JavaでJTextFieldに数値のみ入力できるようにする方法

    JTextFieldの入力制限とはデフォルトのJTextFieldは、数値・文字・特殊文字など、あらゆる種類の入力を受け付けることができます。しかし、ユーザーがJTextFieldに入力した内容を検証するのは意外と難しく、特にintなどの数値型へ変換する必要がある場合は注意が必要です。本記事では、JTextFieldに数値のみ入力できるように制限する方法を、具体的なサンプルコードとともに解説します。実装のポイントキー入力を監視するためにKeyListener(KeyAdapter)を使用し、押されたキーの文字が「0」から「9」の範囲内であるかどうかを判定します。数値であれば編集を許可し、それ以

  2. Tkinterでテキストウィジェットを読み取り専用(無効化)にする方法

    Tkinterでは、テキストウィジェットを無効化(disabled)したいケースがあります。これを実現するには、テキストウィジェットの state オプションを DISABLED に設定します。こうすることでテキストウィジェットがフリーズし、読み取り専用の状態になります。この記事では、テキストウィジェットとボタンを作成し、ボタンをクリックするとテキストウィジェットを即座に無効化できるサンプルを紹介します。コード例# ライブラリのインポート from tkinter import * # ウィンドウのインスタンスを作成 win = Tk() # ウィンドウのサイズを設定 win.geomet