clone ()
создает неглубокий клон - он копирует только первый уровень полей. Вам следует избегать использования clone ()
и Cloneable
, потому что очень сложно реализовать его правильно, и очень вероятно, что что-то будет сломано, хотя и не сразу видно. См. , что говорит об этом Джошуа Блох .
Если вам нужна глубокая копия, т.е. клонируется вся иерархия объектов, я могу предложить два варианта:
Serializable
, используйте SerializationUtils.clone (..)
(из commons-lang ) Если, однако, вы хотите неглубокую копию, то есть вы все равно хотите, чтобы все ваши поля были скопированы к новому объекту, но поля и поля полей (и т. д.) указывают на свои исходные значения, тогда вы можете использовать BeanUtils.clone (..)
(из commons-beanutils )
Не говоря уже о клонировании, наличие 100 переменных-членов - плохой знак. Рассмотрите возможность разделения вашего класса на несколько классов (update: и несколько таблиц, используя внешние ключи. Конечно, если это применимо. Если это действительно свойства одного и того же объекта, тогда прекрасно)
Одним из вариантов может быть использование сериализации. Это не самый быстрый, но, наверное, один из самых безопасных. Посмотрите код на этом сайте:
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;
}
}