Мелкая копия Карты в Java

Насколько я понимаю существует несколько путей (возможно, другие также) для создания мелкой копии a Map в Java:

Map<String, Object> data = new HashMap<String, Object>();
Map<String, Object> shallowCopy;

// first way
shallowCopy = new HashMap<String, Object>(data);

// second way
shallowCopy = (Map<String, Object>) ((HashMap<String, Object>) data).clone();

Один путь предпочтен по другому, и если так, почему?

Одна вещь, которую стоит упомянуть, состоит в том, что второй путь дает "Бросок Непроверенный" предупреждение. Таким образом, необходимо добавить @SuppressWarnings("unchecked") обойти его, который немного раздражает (см. ниже).

@SuppressWarnings("unchecked")
public Map<String, Object> getDataAsMap() {
    // return a shallow copy of the data map
    return (Map<String, Object>) ((HashMap<String, Object>) data).clone();
}
103
задан polygenelubricants 1 March 2010 в 23:07
поделиться

1 ответ

Всегда лучше копировать, используя конструктор копирования. clone() в Java сломан (см. SO: Как правильно переопределить метод clone?).

Josh Bloch on Design - Copy Constructor versus Cloning

Если вы читали пункт о клонировании в моей книге, особенно если вы читали между строк, вы узнаете, что я считаю clone глубоко сломанным. [...] Очень жаль, что клонируемый сломан, но это случается".

Блох (который, кстати, разработал и реализовал фреймворк Collection) даже пошел дальше, заявив, что он предоставляет метод clone() только "потому что люди ожидают его". На самом деле он НЕ рекомендует использовать его вообще.


Я думаю, что более интересный спор заключается в том, лучше ли конструктор копирования, чем фабрика копирования, но это уже совсем другая дискуссия.

106
ответ дан 24 November 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: