2012-05-24 2 views
1

Я застрял в этом очень долгое время.Clone() корпус для глубокого клонирования?

скажите, если следующий код делает клон или нет?

class A 
{ 
int i; 
    int j; 
    String str; 
    A() 
    { 
     i=10; 
     j=30; 
     str="Hello"; 
    } 
    A(A a) 
    { 
     this.i=a.i; 
     this.j=a.j; 
     this.str=a.str; 
    } 
} 
class B 
{ 
    public static void main(String args[]) 
    { 
     A a = new A(); 
     A a1 = new A(a); 
     /* I want to make clone like this. */ 
     } 
} 

, когда я запускаю этот код, и когда я печатаю hashcode a и a1, они разные. Но некоторые из моих друзей говорят, что это не правильный способ сделать клон. Вы должны реализовать интерфейс Cloneable, действительно ли это необходимо? На мой взгляд, это может быть хороший подход, если я хочу сделать глубокую копию даже в случае производной ссылочной переменной. Спасибо.

+1

Ваш код не делает глубокую копию или даже мелкую копию ('str' отличается). Вы действительно хотите получить глубокую копию? Кроме того, ваши друзья правы; то, что у вас есть, называется _copy constructor_. Это совершенно прекрасный стиль кодирования. Кроме того, если вы не реализуете 'hashcode()', вы должны ожидать, что отдельные объекты будут иметь разные хэш-коды. –

+0

Мой код отлично делает глубокую копию. значения всех полей одинаковы. Да, это конструктор копирования, который выполняет глубокую копию. 'И, очевидно, я не переопределяю hashcode(), поэтому я не буду получать одинаковые хэш-коды. Но почему, по вашему мнению, он делает глубокую копию? –

+0

Во-первых, вы изменили свой код, так как я разместил свой комментарий, поэтому часть моего комментария теперь не имеет значения. Он делает копию _shallow_. Однако, если вам нужна глубокая копия, вам нужно будет сделать это. This.str = new String (a.str) '. Поскольку String неизменен, это совсем неважно, но это тоже не глубокая копия. –

ответ

2

Для клонирования объекта вам необходимо реализовать интерфейс Clonable. То, что вы реализовали, называется конструктором копирования. Конструкторы копирования предпочтительнее реализации Clonable.

Причина, по которой ваш скопированный объект имеет другой hashcode/equals из объекта, из которого он скопирован, состоит в том, что вы не переопределили хэш-код или равные функции в своем классе A, поэтому он проверяет идентификацию, а не просто равенство (точно тот же объект, а не объект с одинаковыми значениями). Переопределяя hashcode/equals, вы можете заставить свой класс сравнить значения его свойств.

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