Zrobiłem szybkie wyszukiwanie w Google na temat implementacji clone () w Javie i znalazłem: http://www.javapractices.com/topic/TopicAction.do?Id=71
Zawiera następujący komentarz:
konstruktory kopiujące i statyczne metody fabryczne stanowią alternatywę dla klonowania i są znacznie łatwiejsze do wdrożenia.
Chcę tylko zrobić głęboką kopię. Wydaje się, że wdrożenie clone () ma wiele sensu, ale ten artykuł wysoko oceniany w Google trochę mnie przeraża.
Oto problemy, które zauważyłem:
Konstruktory kopiujące nie działają z typami generycznymi.
Oto pseudokod, który się nie kompiluje.
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 kopiującego 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 clone () w klasie ogólnej.
Zauważyłem, że klon nie jest metodą statyczną, ale czy nadal nie byłoby konieczne tworzenie głębokich kopii wszystkich chronionych pól? Podczas implementacji clone () dodatkowy wysiłek związany z rzucaniem wyjątków w nieklonowalnych podklasach wydaje mi się trywialny.
Czy coś mi brakuje? Wszelkie spostrzeżenia będą mile widziane.