java - 比較 - linkedhashmap




最終的なキーを強制するJavaマップの実装はありますか? (2)

Google Javaライブラリ(Guava)のImmutableMapクラスは、探しているソリューションです。 最終的なキーが必要なのは、マップ内の値も最終的に同じようになることを意味します。 そして、あなたはこのようなあなたのマップを構築することができます:

ImmutableMap<String,Integer> myMap = ImmutableMap.<String, Integer>builder()
    .put("john", 3) 
    .put("rogerio", 5)
    .put("alfonso", 45)
    .put("leonidas", 577)
    .build();

キーが値を取得すると、同じキーに値を設定しようとすると、例外がスローされます。

例えば:

map.put("John", 3); //OK
map.put("John", 7); // throws some exception
map.put("John", 11); // throws some exception

もちろん、私はこれを自分で実装することができます(例えば、 HashMapを拡張するif map.contains(key)すべての呼び出しを囲むことによって)。しかし、コードをきれいにする準備が整ったものを使うことを好みます。

誰もそのような実装を知っていますか?


そのような実装はJDKにはありません。 ここであなたの最善の策は、構成を使用することです:

public final class CustomMap<K, V>
    implements Map<K, V>
{
    private final Map<K, V> delegate;

    public CustomMap(final Map<K, V> delegate)
    {
        this.delegate = delegate;
    }

    @Override
    public V put(final K key, final V value)
    {
        // Can't use the return value of delegate.put(), since some implementations
        // allow null values; so checking delegate.put() == null doesn't work
        if (delegate.containsKey(key))
            throw new IllegalArgumentException("duplicate key: " + key);
        return delegate.put(key, value);
    }

    @Override
    public void putAll(@Nonnull final Map<? extends K, ? extends V> m)
    {
        for (final Entry<? extends K, ? extends V> entry: m.entrySet())
            put(entry.getKey(), entry.getValue());
    }

    // delegate all other methods
}

さもなければ、Guavaを使うならば、他の人が示唆しているように、ForwardingMapを使います。 これは基本的に上記のコードの一般化されたバージョンです。

実際に 、Guavaを使用してください

他の注記:あなたはここで// throws some exceptionすることはできません。 Map.put()は例外をスローすることを宣言しないので、唯一のオプションは未確認の例外をここに投げることです。







map