2015-07-24 1 views
3

Я читал это answer, и он упомянул link, где автор объясняет, почему мы не должны использовать Cloneable. Но, по-прежнему есть сомнения, что было сказано тамCopy Constructor vs Cloneable. Почему я не должен рассматривать Cloneable?

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

Но здесь я

 Init s = Init.getInstance(); // getting instance 
     int count=0; 
     Cloneable[] v = new Cloneable[5]; // creating array 
     Init x = s; 
     Init y = new Init(s); 
     try { 
      while (count < 5) { 
       v[count++] = (Cloneable) s.clone(); // casting it. 
      } 

      s.setClassName("Example"); 
      System.out.println(((Init) v[2]).getClassName()); // Displaying. 
     } catch (CloneNotSupportedException ex) { 
      ex.printStackTrace(); 
     } 

я смог создать Cloneable массив, и я сделал то, что сказал автор вызовет ошибку или я неправильно понял автор заявление? Кто-нибудь, пожалуйста, помогите мне понять причину выбора Copy Constructor over Cloneable.

+0

Я .net разработчик, но упс концепции похожи на Java анс C# .Как в моей understan ding В Copy Constructor ссылка на память одинакова для объекта как реального, так и скопированного. Поэтому, когда вы меняете значение реального объекта, вы увидите, что он также влияет на скопированный объект. На клонируемых объектах оба имеют различную память, они не зависели, они не влияли друг на друга. –

ответ

4

Вы не литье s в Cloneable, а затем набрали clone().

Вместо этого вы вызываете s.clone(), а затем лидируете результат до Clonable. Вы можете это сделать, потому что s имеет тип Init и Init имеет public clone() метод.

Сделайте это вместо того, чтобы и вы найдете крика компилятор,

v[count++] = ((Cloneable) s).clone(); 

Теперь предположим, что вы хотите клонировать массив (Вы, очевидно, только знаю, что это Cloneable массив. Это значит, вы не знаете, что фактическое Тип.

Cloneable[] cloneArray = new Cloneable[5]; 
cloneArray[i] = new Init(); // Let's say it's initialized with different type objects but all `Cloneable`. 

for (Cloneable object : cloneArray) { 
     object.clone(); // Compiler wont allow it. And you don't know what type it is. 
} 

Таким образом, вы в основном не может глубоко клонировать Cloneable массив.

+0

Это прекрасно. Но я должен был скопировать его в массив Cloneable. Правильно? Тогда почему я не должен выбирать Cloneable? – Ravi

+0

Нет, это означает, что вы не можете клонировать массив Cloneable. Проверьте мой отредактированный ответ. – Codebender

+0

Итак, это единственные вещи, которые делают разницу между Copy Constructor и Cloneable? – Ravi

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