пример мелкой и глубокой копии - PullRequest
2 голосов
/ 30 марта 2012

Могу ли я реализовать глубокое и поверхностное копирование следующим образом? Это правильно? Любой из следующих 2 методов клонирования будет помещен в окончательный код

public class Student{
  private String name;
  private DepartMent dept;


 //deep copy 
 public Object clone() throws CloneNotSupportedException{
  Student s =  (Student)super.clone();
  s.septDept((Department)dept.clone());
 }

 //shallow copy
 public Object clone() throws CloneNotSupportedException{
   return super.clone();
 }

}

Ответы [ 3 ]

7 голосов
/ 30 марта 2012

Вместо того, чтобы пытаться реализовать Cloneable, что считается нарушенным , я бы рекомендовал вам использовать конструкторы копирования . Конструктор копирования принимает экземпляр своего объявленного типа в качестве аргумента и копирует поля этого экземпляра в новый объект. Например:

public Student(Student copyFrom) {
    this.name = copyFrom.name;
    this.dept = copyFrom.dept;
}

...

Student copy = new Student(originalStudent);

Если Department также предоставляет конструктор копирования, это позволит вам сделать глубокую копию Student. Например:

public Student(Student copyFrom) {
    this.name = copyFrom.name;
    this.dept = new Department(copyFrom.dept);
}

Хотя из вашего вопроса неясно, зачем нужна глубокая копия.


Для дальнейшего чтения, эта статья затрагивает как проблемы Cloneable, так и ограничения конструкторов копирования.

0 голосов
/ 27 февраля 2014

Насколько я понимаю, это правильно, нужно убедиться только в одном: переопределении метода clone () в классе DepartMent.

0 голосов
/ 30 марта 2012

Вы также можете использовать метод dup (), который также возвращает копию оригинала, зависит от того, какой код вы пытаетесь реализовать с помощью метода копирования ... вы просто просите совета, не предоставляя нам достаточно информации для направить вас правильно ... Есть также множество ответов на вопросы в stackoverflow, в котором есть примеры, так что вы должны сначала проверить это со своими вещами, прежде чем обращаться за дополнительной помощью

...