Насколько я понимаю существует несколько путей (возможно, другие также) для создания мелкой копии 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();
}
Всегда лучше копировать, используя конструктор копирования. clone()
в Java сломан (см. SO: Как правильно переопределить метод clone?).
Josh Bloch on Design - Copy Constructor versus Cloning
Если вы читали пункт о клонировании в моей книге, особенно если вы читали между строк, вы узнаете, что я считаю
clone
глубоко сломанным. [...] Очень жаль, чтоклонируемый
сломан, но это случается".
Блох (который, кстати, разработал и реализовал фреймворк Collection) даже пошел дальше, заявив, что он предоставляет метод clone()
только "потому что люди ожидают его". На самом деле он НЕ рекомендует использовать его вообще.
Я думаю, что более интересный спор заключается в том, лучше ли конструктор копирования, чем фабрика копирования, но это уже совсем другая дискуссия.