5

このjava.util.Collectionsクラスを使用すると、コレクション インスタンスを変更不可にすることができます。以下の方法

protected Map<String, List<String>> getCacheData() {
    return Collections.unmodifiableMap(tableColumnCache);
}

umodifiableMapを返すため、UnsupportedOperationExceptionはマップ インスタンスを変更しようとしたために発生します。

@Test(expected = UnsupportedOperationException.class)
public void checkGetCacheData_Unmodifiable() {
    Map<String, List<String>> cacheData = cache.getCacheData();
    cacheData.remove("SomeItem");
}

残念ながら、すべてのList<String>子が変更不可能というわけではありません。それで、子の値に対しても変更不可能な動作を強制する方法があるかどうか知りたいList<String>ですか?

もちろん、別の方法として、マップのキーと値のペアを反復処理し、リストを変更不可にして、マップを再構築することもできます。

4

4 に答える 4

5

ImmutableList インスタンスでいっぱいの ImmutableMap が必要です。あなたの正気を保つために グアバを使用してください。

まず、必要な ImmutableList インスタンスを作成します。

ImmutableList<String> list1 = ImmutableList.of(string1, string2, etc);
ImmutableList<String> list2 = ImmutableList.of(string1, string2, etc);

次に、ImmutableMap を作成します。

ImmutableMap<String,List<String>> map = ImmutableMap.of("list1", list1, "list2", list2);

不変のリストとマップをインスタンス化するには、ビルダー パターンを含め、さまざまな方法があります。詳細については、 ImmutableListおよびImmutableMapの JavaDocs を確認してください。

于 2013-09-30T14:39:24.480 に答える
4

残念ながら、各 List を unmodifiable としてラップする必要がありますList。これは、 を使用して実行できますjava.util.Collections.unmodifiableList(...)。の作成を制御Listsできる場合は、値を設定した直後にこれを行うことができます (そして行う必要があります)。これらのコレクションの作成を制御できない場合は、認識していない他のコードがその動作に依存している可能性があるため、コレクションを変更不可にすることを再考することをお勧めします。それが役立つことを願っています。

于 2013-09-30T14:11:47.537 に答える
2

たぶんそれはあなたが必要としているものではないかもしれませんが、Guava immutable list multimapを使用することをお勧めします

于 2013-09-30T14:05:12.633 に答える
0

Map をサブクラス化して、変更不可能なリストを返します。

于 2013-09-30T14:40:22.947 に答える