Как легко клонировать контейнер (например, ArrayList)?Это неправильно использовать .clone ()? - PullRequest
3 голосов
/ 23 февраля 2011

Мое, возможно, наивное, решение для клонирования ArrayList (замена вектора) -

ArrayList<Double> alBis = (ArrayList<Double>) alOriginal.clone();

учитывая, что поскольку массив содержит неизменяемые значения типа Double, мне не нужно клонировать их, но только контейнер.

Поскольку clone () возвращает объект, я положил туда приведение, но затем -Клинт жалуется, что это неконтролируемый актерский состав.

Так что теперь? Игнорировать это с supressWarnings? Создать новый ArrayList и скопировать оригинальные элементы с компактом для? Любой метод библиотеки похож на Arrays.copyOf ()

Я прочитал Непроверенное предупреждение о сотворении , но принятый путь невероятно сложен.

Ответы [ 3 ]

13 голосов
/ 23 февраля 2011

clone() имеет серьезные недостатки, см. этот вопрос для справки. Не используйте его!

Вместо этого все стандартные Коллекции имеют конструкторы копирования. Используйте их:

List<Double> original = // some list
List<Double> copy = new ArrayList<Double>(original);

Справка:

4 голосов
/ 23 февраля 2011

Неправильно ли использовать .clone ()?

Следует по возможности избегать этого.Это устаревший, плохо спроектированный и принципиально сломанный API .Лучше использовать конструктор копирования, как предложено @Sean.

1 голос
/ 23 февраля 2011

Лично я бы порекомендовал Google guava-библиотеки , и:

 ImmutableCollection<Double> copy = ImmutableList.copyOf(original);

И не используйте клон JRE, потому что он отстой (если хотите знать почему, тогда читайте ссылки).

Справка:

...