Search code examples
javacollectionsdictionaryunmodifiable

Returning an unmodifiable map


Using Collections.unmodifiableMap(...), I'm trying to return an unmodifiable view of a map. Let's say I have the following method,

public final Map<Foo, Bar> getMap(){
    ...
    return Collections.unmodifiableMap(map);
}

Why is it legal elsewhere to do the following,

Map<Foo, Bar> map = getMap();
map.put(...);

This doesn't throw an UnsupportedOperationException like I thought it would. Can someone please explain this, or suggest how I can successfully return a truly unmodifiable map?


Solution

  • Are you sure you're not masking your exceptions somehow? This works absolutely fine, in that it throws UnsupportedOperationException:

    import java.util.*;
    
    public class Test {
    
        public static void main(String[] args) {
            Map<String, String> map = getMap();
            map.put("a", "b");
        }
    
        public static final Map<String, String> getMap(){
            Map<String, String> map = new HashMap<String, String>();
            map.put("x", "y");
            return Collections.unmodifiableMap(map);
        }
    }
    

    I suggest you print out map.getClass() on the return value of the method - I would expect it to be an UnmodifiableMap.