klon () vs konstruktor kopii a metoda fabryczna?

Zrobiłem szybkie google przy wdrażaniu clone () w Javie i znalazłem:http://www.javapractices.com/topic/TopicAction.do?Id=71

Ma następujący komentarz:

konstruktory kopiowania i statyczne metody fabryczne stanowią alternatywę dla klonowania i są znacznie łatwiejsze do wdrożenia.

Chcę tylko zrobić głęboką kopię. Implementacja clone () wydaje się mieć dużo sensu, ale ten wysoce rankingowy artykuł sprawia, że ​​trochę się boję.

Oto problemy, które zauważyłem:

Kopiowanie konstruktorów nie działa z Generics.

Oto pseudo-kod, który się nie skompiluje.

public class MyClass<T>{
   ..
   public void copyData(T data){
       T copy=new T(data);//This isn't going to work.    
   }
   ..
}

Przykład 1: Używanie konstruktora kopii w klasie ogólnej.

Metody fabryczne nie mają standardowych nazw.

Miło jest mieć interfejs do kodu wielokrotnego użytku.

public class MyClass<T>{
    ..
    public void copyData(T data){
        T copy=data.clone();//Throws an exception if the input was not cloneable
    }
    ..
}

Przykład 2: Używanie klonu () w klasie ogólnej.

Zauważyłem, że klon nie jest metodą statyczną, ale czy nadal nie jest konieczne wykonywanie głębokich kopii wszystkich chronionych pól? Podczas implementacji clone () dodatkowy wysiłek wrzucania wyjątków do nieklonowalnych podklas wydaje mi się trywialny.

Czy czegoś mi brakuje? Wszelkie spostrzeżenia będą mile widziane.

questionAnswers(10)

yourAnswerToTheQuestion