Collections.unmodifiableMap(...)
を使用して、マップの変更不可能なビューを返そうとしています。次の方法があるとしましょう。
public final Map<Foo, Bar> getMap(){
...
return Collections.unmodifiableMap(map);
}
他の場所で次のことを行うことが合法であるのはなぜですか、
Map<Foo, Bar> map = getMap();
map.put(...);
これは、私が思っていたように UnsupportedOperationException
をスローしません。誰かがこれを説明したり、本当に変更できないマップを正常に返す方法を提案したりできますか?
どういうわけかあなたの例外を隠していないのですか?これは、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()
を出力することをお勧めします-私はexpectそれはUnmodifiableMap
になります。
小さなテストプログラムを作成しましたが、データを入力しようとすると、プログラムが「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");
}
}
クラスで他に何をしていますか?
他に何か問題があるに違いありません。変更不可能なマップとしてラップした後、そのマップで何かをput
できる方法はありません。
私も戻ることをお勧めします
return Collections.<Foo, Bar>unmodifiableMap(map);
そうしないと、-Xlint:uncheckedを使用してコードをコンパイルするときに、「チェックされていない」警告が表示されます。