Метод clone()
и интерфейс Cloneable
, предложенные другими авторами, были созданы с неверным предположением, что было бы неплохо иметь общее копированиеметод.Реализации по умолчанию делают мелкий клон текущего объекта, но вы можете переопределить его, чтобы сделать глубокий клон.
Не существует правильного, общего способа копирования произвольных объектов, то, что вы хотите скопировать, зависит от задействованных объектов.Например, неизменяемые объекты никогда не нуждаются в копировании (это было бы просто пустой тратой пространства), в то время как некоторые типы объектов не могут быть скопированы (как бы вы скопировали FileOutputStream
, например?),
Самый элегантный способ, который я нахожу, - это неизменяемые объекты с методами, которые возвращают копию только с одним измененным полем:
class Pony {
private final String name;
private final Color color;
private final int tailLength;
// constructors and accessors omitted
Pony withName(String newName) {
return new Pony(newName, color, tailLength);
}
Pony withColor(Color newColor) {
return new Pony(name, newColor, tailLength);
}
Pony withTailLength(String newTailLength) {
return new Pony(name, color, newTailLength);
}
}
// Usage:
Pony tony = new Pony("Tony", Color.DAPPLE, 32);
Pony maurice = tony.withName("Maurice") // Maurice is like Tony, but black.
.withColor(Color.BLACK);
К сожалению, вы получаете множество шаблонов таким образом, и нетподдержка основной IDE либо (возможно, есть плагины).С этим связан шаблон Builder , рекомендованный Джошем Блохом в Effective Java.