Java: logica dell’interfaccia Cloneable

Perché il metodo .clone() non era specificato nell’interfaccia java.lang.Cloneable ?

Fondamentalmente, è un’interfaccia rotta. Ken Arnold e Bill Venners ne hanno discusso in Java Design Issues .

Arnold:

Se dovessi essere Dio a questo punto, e molte persone probabilmente sono contento che io non lo sia, direi una versione Copyable e avere una Copyable , perché Cloneable ha dei problemi. Oltre al fatto che è scritto in modo errato, Cloneable non contiene il metodo clone . Ciò significa che non è ansible verificare se qualcosa è un’istanza di Cloneable , Cloneable in Cloneable e richiamare il clone . Devi usare di nuovo il riflesso, che è terribile. Questo è solo un problema, ma sicuramente risolverei.

Vedi questo bug nel database degli errori Java:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033

In sostanza, si tratta di un difetto di progettazione nelle versioni precedenti di Java che non intendono risolvere nell’interfaccia Cloneable in quanto ciò comprometterebbe la compatibilità con alcuni codici esistenti.

In Java, c’è questo concetto di interfacce marker. L’interfaccia Cloneable non ha metodi o campi e serve solo a identificare la semantica dell’essere clonabile.

dal sito Web di dev-x :

Spesso si incontrano interfacce in Java che non hanno alcun comportamento. In altre parole, sono solo definizioni di interfaccia vuote. Questi sono noti come interfacce marcatore. Alcuni esempi di interfacce marker nell’API Java includono:

  • java.lang.Cloneable
  • java.io.Serializable
  • java.util.EventListener

Sul progetto su cui lavoro, abbiamo creato un’interfaccia chiamata PublicCloneable, contiene il metodo clone e specifica che è pubblico.

Trovo che questo sia utile: il fatto che ci sia un metodo clone, ma non è ansible accedervi, non aiuta molto.

 public interface PublicCloneable extends Cloneable { public Object clone(); } 

Perché il metodo clone è implementato nella class Object a causa della sua condizione “speciale”: la copia di memoria di oggetti di qualsiasi tipo.