Create Read-Only Map in Java

In this article, we will discuss how to create a read-only Map in Java. We will cover different approaches to achieve this using various classes and methods provided by the Java Collections Framework.

Table of Contents

  1. Introduction
  2. Using Collections.unmodifiableMap
  3. Using Java 9 Map.of and Map.copyOf
  4. Complete Example
  5. Conclusion

Introduction

A read-only Map is a map that does not support any modification operations like put, remove, or clear. This is useful when you want to provide read-only access to a Map to ensure that it cannot be altered.

Using Collections.unmodifiableMap

The Collections.unmodifiableMap method wraps a given map and returns an unmodifiable view of it. Any attempt to modify the map will result in an UnsupportedOperationException.

Example

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class UnmodifiableMapExample {
    public static void main(String[] args) {
        Map<String, String> originalMap = new HashMap<>();
        originalMap.put("key1", "value1");
        originalMap.put("key2", "value2");

        Map<String, String> readOnlyMap = Collections.unmodifiableMap(originalMap);

        System.out.println("Read-Only Map: " + readOnlyMap);

        // Attempting to modify the map will throw UnsupportedOperationException
        try {
            readOnlyMap.put("key3", "value3");
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot modify the read-only map: " + e.getMessage());
        }
    }
}

Output:

Read-Only Map: {key1=value1, key2=value2}
Cannot modify the read-only map: null

Using Java 9 Map.of and Map.copyOf

Java 9 introduced new factory methods for creating immutable maps. These maps are inherently read-only and any attempt to modify them will result in an UnsupportedOperationException.

Using Map.of

The Map.of method can be used to create a small read-only map with up to 10 entries.

Example

import java.util.Map;

public class MapOfExample {
    public static void main(String[] args) {
        Map<String, String> readOnlyMap = Map.of(
            "key1", "value1",
            "key2", "value2"
        );

        System.out.println("Read-Only Map: " + readOnlyMap);

        // Attempting to modify the map will throw UnsupportedOperationException
        try {
            readOnlyMap.put("key3", "value3");
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot modify the read-only map: " + e.getMessage());
        }
    }
}

Output:

Read-Only Map: {key1=value1, key2=value2}
Cannot modify the read-only map: null

Using Map.copyOf

The Map.copyOf method can be used to create an unmodifiable copy of an existing map.

Example

import java.util.HashMap;
import java.util.Map;

public class MapCopyOfExample {
    public static void main(String[] args) {
        Map<String, String> originalMap = new HashMap<>();
        originalMap.put("key1", "value1");
        originalMap.put("key2", "value2");

        Map<String, String> readOnlyMap = Map.copyOf(originalMap);

        System.out.println("Read-Only Map: " + readOnlyMap);

        // Attempting to modify the map will throw UnsupportedOperationException
        try {
            readOnlyMap.put("key3", "value3");
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot modify the read-only map: " + e.getMessage());
        }
    }
}

Output:

Read-Only Map: {key1=value1, key2=value2}
Cannot modify the read-only map: null

Complete Example

Here's a complete example that demonstrates all methods for creating a read-only map in Java.

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

public class ReadOnlyMapExample {
    public static void main(String[] args) {
        // Using Collections.unmodifiableMap
        Map<String, String> originalMap = new HashMap<>();
        originalMap.put("key1", "value1");
        originalMap.put("key2", "value2");

        Map<String, String> readOnlyMap1 = Collections.unmodifiableMap(originalMap);
        System.out.println("Read-Only Map (unmodifiableMap): " + readOnlyMap1);

        try {
            readOnlyMap1.put("key3", "value3");
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot modify the read-only map (unmodifiableMap): " + e.getMessage());
        }

        // Using Map.of
        Map<String, String> readOnlyMap2 = Map.of(
            "key1", "value1",
            "key2", "value2"
        );
        System.out.println("Read-Only Map (Map.of): " + readOnlyMap2);

        try {
            readOnlyMap2.put("key3", "value3");
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot modify the read-only map (Map.of): " + e.getMessage());
        }

        // Using Map.copyOf
        Map<String, String> readOnlyMap3 = Map.copyOf(originalMap);
        System.out.println("Read-Only Map (Map.copyOf): " + readOnlyMap3);

        try {
            readOnlyMap3.put("key3", "value3");
        } catch (UnsupportedOperationException e) {
            System.out.println("Cannot modify the read-only map (Map.copyOf): " + e.getMessage());
        }
    }
}

Output:

Read-Only Map (unmodifiableMap): {key1=value1, key2=value2}
Cannot modify the read-only map (unmodifiableMap): null
Read-Only Map (Map.of): {key1=value1, key2=value2}
Cannot modify the read-only map (Map.of): null
Read-Only Map (Map.copyOf): {key1=value1, key2=value2}
Cannot modify the read-only map (Map.copyOf): null

Conclusion

Creating a read-only map in Java can be done using various approaches. The Collections.unmodifiableMap method wraps an existing map to provide a read-only view, while Java 9's Map.of and Map.copyOf methods provide a simpler and more concise way to create immutable maps. This guide provided examples to demonstrate each approach, allowing you to choose the method that best fits your needs.

Comments