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

Javaでコレクションを読み取り専用にする方法|unmodifiable系メソッドの使い方

Collectionsクラスとは

java.utilパッケージのCollectionsクラスは、コレクション専用に動作するユーティリティメソッドを多数提供しており、多相的アルゴリズム(polymorphic algorithms)を含むさまざまな追加操作を行うことができます。

このクラスには、既存のコレクションを変更不可能(読み取り専用)なビューとして返すunmodifiableXXX()メソッド群が用意されています。主なバリアントは以下の通りです。

No.メソッドと説明
1static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c)
任意のコレクションオブジェクトを受け取り、指定されたコレクションの変更不可能なビューを返します。
2static <T> List<T> unmodifiableList(List<? extends T> list)
Listインターフェースのオブジェクトを受け取り、その変更不可能なビューを返します。
3static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m)
Mapインターフェースのオブジェクトを受け取り、その変更不可能なビューを返します。
4static <T> Set<T> unmodifiableSet(Set<? extends T> s)
Setインターフェースのオブジェクトを受け取り、その変更不可能なビューを返します。
5static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K,? extends V> m)
SortedMapインターフェースのオブジェクトを受け取り、その変更不可能なビューを返します。
6static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s)
SortedSetインターフェースのオブジェクトを受け取り、指定されたソート済みセットの変更不可能なビューを返します。

対象となるコレクションの種類に応じて、これらのメソッドのいずれかを呼び出すだけで、コレクションオブジェクトを読み取り専用にできます。

サンプルプログラム

次のJavaプログラムでは、Vectorオブジェクトを生成して要素を追加し、それを読み取り専用のコレクションに変換しています。

import java.util.Collection;
import java.util.Collections;
import java.util.Vector;

public class CollectionReadOnly {
    public static void main(String[] args) {
        // Vectorオブジェクトの生成
        Vector<String> vector = new Vector<String>();
        vector.add("JavaFx");
        vector.add("Java");
        vector.add("WebGL");
        vector.add("OpenCV");
        System.out.println(vector);

        Collection<String> immutableVector = Collections.unmodifiableCollection(vector);
        System.out.println("Vector converted to read only " + immutableVector);

        immutableVector.add("CoffeeScript"); // 変更しようとすると例外が発生
    }
}

実行結果と例外

[JavaFx, Java, WebGL, OpenCV]
Vector converted to read only [JavaFx, Java, WebGL, OpenCV]
Exception in thread "main" java.lang.UnsupportedOperationException
    at java.util.Collections$UnmodifiableCollection.add(Unknown Source)
    at September19.CollectionReadOnly.main(CollectionReadOnly.java:20)

注意点

一度読み取り専用のビューを取得すると、その内容を変更することはできません。つまり、add()remove()による要素の追加・削除はもちろん、Iterator経由での変更も許されません。これらの操作を実行しようとすると、UnsupportedOperationExceptionがスローされます。

また、元のコレクション自体への参照を保持している場合は、そちらから内容を変更できてしまう点にも注意が必要です。完全な不変性(イミュータブル性)が必要なケースでは、Java 9以降で利用可能なList.of()Set.of()Map.of()といったファクトリメソッドや、GuavaのImmutableコレクションの活用も検討するとよいでしょう。

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

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

  2. Windows 11/10でファイルやフォルダを「非表示」または「読み取り専用」に設定する方法

    この記事では、Windows 11/10のPCでファイルやフォルダを「非表示(Hidden)」または「読み取り専用(Read only)」に設定する方法をご紹介します。 ファイルを「非表示」に設定すると、他の人はそのファイルやフォルダを目にすることができなくなります。一方、「読み取り専用」に設定すると、ファイルの中身を読むことはできますが、変更を加えて保存することはできません。 「隠しファイル」とは何か 「隠しファイル」とは、プロパティで「隠しファイル」属性が有効になっているファイルのことです。これらのファイルが隠されているのは、多くの場合、オペレーティングシステムに関わる重要なファイルだか