Объект Java копирует наилучший вариант? [дубликат]

5
задан Community 23 May 2017 в 12:34
поделиться

2 ответа

clone () создает неглубокий клон - он копирует только первый уровень полей. Вам следует избегать использования clone () и Cloneable , потому что очень сложно реализовать его правильно, и очень вероятно, что что-то будет сломано, хотя и не сразу видно. См. , что говорит об этом Джошуа Блох .

Если вам нужна глубокая копия, т.е. клонируется вся иерархия объектов, я могу предложить два варианта:

Если, однако, вы хотите неглубокую копию, то есть вы все равно хотите, чтобы все ваши поля были скопированы к новому объекту, но поля и поля полей (и т. д.) указывают на свои исходные значения, тогда вы можете использовать BeanUtils.clone (..) (из commons-beanutils )

Не говоря уже о клонировании, наличие 100 переменных-членов - плохой знак. Рассмотрите возможность разделения вашего класса на несколько классов (update: и несколько таблиц, используя внешние ключи. Конечно, если это применимо. Если это действительно свойства одного и того же объекта, тогда прекрасно)

10
ответ дан 18 December 2019 в 09:05
поделиться

Одним из вариантов может быть использование сериализации. Это не самый быстрый, но, наверное, один из самых безопасных. Посмотрите код на этом сайте:

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectputStream;
import java.io.ObjectOutputStream;

public class DeepObjectCopy {

  public static Object clone(Object copyObject) {
    try {
      ByteArrayOutputStream baos = new ByteArrayOutputStream(4096);
      ObjectOutputStream oos = new ObjectOutputStream(baos);
      oos.writeObject(copyObject);
      ByteArrayInputStream bais = new ByteArrayInputStream(baos.toByteArray());
      ObjectputStream ois = new ObjectputStream(bais);
      Object deepCopy = ois.readObject();
      return deepCopy;
    } catch (IOException e) {
      e.printStackTrace();
    } catch(ClassNotFoundException e) {
      e.printStackTrace();
    }
    return null;
  }
}
8
ответ дан 18 December 2019 в 09:05
поделиться
Другие вопросы по тегам:

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