2011-08-15 8 views
17

Sử dụng Collections.unmodifiableMap(...), Tôi đang cố gắng trả lại chế độ xem không thể sửa đổi của bản đồ. Hãy nói rằng tôi có phương pháp sau đây,Trả lại bản đồ không thể sửa đổi

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

Tại sao nó quy phạm pháp luật ở nơi khác để làm những điều sau đây,

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

này không ném một UnsupportedOperationException như tôi nghĩ. Ai đó có thể vui lòng giải thích điều này, hoặc đề nghị làm thế nào tôi có thể trở lại thành công một bản đồ thực sự không thể sửa đổi được?

+0

Bạn có thể đăng thêm mã không? Thật khó tin ... – toto2

Trả lời

31

Bạn có chắc chắn bạn không che giấu ngoại lệ của mình bằng cách nào đó không? Này hoạt động hoàn toàn tốt, ở chỗ nó ném 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); 
    } 
} 

tôi đề nghị bạn in ra map.getClass() trên giá trị trả về của phương pháp này - tôi sẽ mong đợi nó là một UnmodifiableMap.

+7

@ Jon, tôi không biết rằng 'UnsupportedOperationException' là lỗi thời gian chạy. Tôi đã giả định rằng đó là một lỗi thời gian biên dịch. Đây là lỗi của tôi, nhưng câu trả lời của bạn đã giúp tôi nhận ra câu hỏi này thật ngớ ngẩn như thế nào. Cảm ơn bạn! – mre

4

Tôi tạo ra một chương trình thử nghiệm nhỏ và chương trình của tôi đã ném một 'UnsupportedOperationException' khi tôi đã cố gắng để đưa dữ liệu trong

mã:.

import java.util.*; 

public class TestUnmodifiableMap 
{ 
    Map<Integer, String> myMap; 

    public TestUnmodifiableMap() 
    { 
     myMap = new HashMap<Integer, String>(); 
    } 

    public final Map<Integer, String> getMap() 
    { 
     return Collections.unmodifiableMap(myMap); 
    } 

    public static void main(String[] args) 
    { 
     TestUnmodifiableMap t = new TestUnmodifiableMap(); 
     Map<Integer, String> testMap = t.getMap(); 

     testMap.put(new Integer("1"), "Hello"); 
    } 
} 

Bạn đang làm gì khác trong lớp học của bạn?

2

Phải có điều gì đó khác sai. Không có cách nào bạn có thể put một thứ gì đó trong bản đồ đó sau khi bạn bọc nó như một bản đồ không thể sửa đổi được.

Tôi cũng xin đề nghị trở lại

return Collections.<Foo, Bar>unmodifiableMap(map); 

nếu không bạn sẽ nhận được cảnh báo "đánh dấu" khi biên dịch mã của bạn với -Xlint: không được kiểm soát.