2013-07-18 3 views
0

Моя функция возвращает набор ключей для элемента HashMap.Лучшая практика: как вернуть набор ключей из метода в java

От the JavaDoc:

Набор поддерживается картой, поэтому изменения в карте отражены в наборе, и наоборот.

Я хочу, чтобы этого не произошло.

Я хочу вернуть немодифицируемый набор, возможно, копию набора.

Я не хочу, чтобы изменения в наборе или карте отражались друг от друга.

Есть ли какие-либо передовые методы борьбы с такой ситуацией?

+0

Вас беспокоит изменение структуры набора, изменение свойств элементов в наборе или их обоих? Если вас беспокоит только первое, просто создайте новый Set: 'Set freshSet = new HashSet (map.keySet());' – jahroy

ответ

1

Лично я бы пошел с Guava Google - особенно для Я хочу вернуть немодифицируемый набор, возможно, копию набора. - если карта растет, ImmutableSet не будет демонстрировать рост:

ImmutableSet.copyOf(map.keySet());

Или, если вы хотите использовать стандартный Java API - Обратите внимание, что в результате Set будет расти, как ваш Map растет:

Collections.unmodifiableSet(map.keySet());

Использование любого из приведенных выше вариантов считается хорошей практикой с учетом ваших требований.

1

Стандартный подход является возвращение копии, как правило, с помощью copy constructor:

Вот метод утилиты вы можете использовать:

public static <K, V> Set<Map.Entry<K, V>> copyKeys(Map<K, V> map) { 
    return new HashSet<Map.Entry<K, V>>(map.keySet()); 
} 
0

Вы можете использовать стандартный Collections.unmodifiableSet, который предназначен именно для этого. Попытки изменить обернутый набор окажутся в UnsupportedOperationException

Смежные вопросы