2013-05-29 5 views
2

У меня есть класс Calle с String nombre; и int addr;. Но метод clone, который я сделал, дает мне неправильные значения.Ищите подходящий способ клонирования

public class Calle{ 
    String nombre; 
    int addr; 

    public Object clone(){ 
     return this; 
    } 
} 

Calle c1 = new Calle("a",1); 
Calle c2 = c1.clone(); 
c2.setAddr(3); 

System.out.println(c1.addr); // value wrong 

Почему значение неверно?

+1

b/c вы фактически не клонируете. вам нужно создать новый объект и вернуть его – greedybuddha

+0

Clone не является специальным методом, он похож на любой другой метод, что касается Java. Вы должны закодировать его, чтобы фактически клонировать объект, а не просто «возвращать это». – Patashu

ответ

2

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

public Object clone(){ 
    return super.clone(); 
} 

Cloneable интерфейс также должен быть реализован.

+0

стандартный клон скопируйте все значения? – leftsync

+0

Да, это делает мелкую копию. Без копирования дочерних объектов. – Mikhail

+0

http://en.wikipedia.org/wiki/Clone_(Java_method) – Mikhail

3

Ваш метод клонирования неправильный, потому что он на самом деле не клонирует что-либо, он просто возвращает тот же объект. clone всегда должен быть новым объектом с теми же значениями, что и оригинал.

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

public Object clone(){ 
    return new Calle(this.nombre, this.addr); 
} 
+0

что все это меняется? – leftsync

+0

Вот и все. Это создаст новую Calle, заполнит те же значения, что и объект, который вы клонируете, и вернет его. – greedybuddha

1

Ваш метод клонирования неправилен, потому что он на самом деле не клонирует что-либо, он просто возвращает тот же объект.

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

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

Смежные вопросы