2011-08-15 19 views
17

Collections.unmodifiableMap(...)を使用して、マップの変更不可能なビューを返そうとしています。のは、私は次のような方法があるとしましょう、変更不可能なマップを返す

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

なぜ私はそれが思ったようにこれはUnsupportedOperationExceptionをスローしません

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

、次の操作を実行する他の場所でそれが合法です。誰かがこれを説明したり、本当に変更できない地図をどのように正常に返すことができるかを提案してもらえますか?

+0

もっとコードを投稿できますか?信じるのは難しいです... – toto2

答えて

31

あなたは何とか例外をマスクしていませんか?それは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); 
    } 
} 

私はあなたがメソッドの戻り値にmap.getClass()をプリントアウト示唆 - 私はそれがUnmodifiableMapするを期待します。

+7

@Jon、私は 'UnsupportedOperationException'がランタイムエラーであることに気づいていませんでした。私はそれがコンパイル時エラーであると仮定していました。これは私のせいですが、あなたの答えは、この質問が本当にいかに愚かであったかを理解する助けになりました。ありがとうございました! – mre

4

私は小さなテストプログラムを作成し、私はデータを入れしようとしたときに私のプログラムは、「UnsupportedOperationExceptionが」投げ

コード:

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"); 
    } 
} 

あなたのクラスで他に何をしているのか?

2

間違いがあります。あなたが変更不可能なマップとしてラップした後に、そのマップに何かputを入れることはできません。未チェック:

私はまた、-Xlintを使用してコードをコンパイルするとき

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

そうあなたが得る「未チェック」の警告を返すようにお勧めします。

関連する問題