Perché il metodo non è stato specificato nel metodo ?Java: logica dell'interfaccia Cloneable
risposta
In sostanza, si tratta di un'interfaccia rotto. Ken Arnold e Bill Venners ne hanno discusso nel Java Design Issues.
Arnold:
Se dovessi essere Dio, a questo punto, e molte persone sono probabilmente contenta io non sono, direi disapprovare
Cloneable
e hanno unCopyable
, perchéCloneable
ha problemi. Oltre al fatto che è errato, loCloneable
non contiene il metodoclone
. Ciò significa che non puoi verificare se qualcosa è un'istanza diCloneable
, trasmetterla aCloneable
e invocareclone
. Devi usare di nuovo il riflesso, che è terribile. Questo è solo un problema, ma sicuramente risolverei.
Vedere questo bug nel database di bug 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 hanno intenzione di risolvere nell'interfaccia Cloneable come ciò possa rompere la compatibilità con alcuni codici esistenti.
mi chiedo perché non hanno aggiunto l'interfaccia 'Copyable' a Java 1.2 ed oltre ... – EpicPandaForce
@EpicPandaForce Probabilmente perché non vogliamo imitare C++ in determinate situazioni. La clonazione dovrebbe essere utilizzata con cura, il più delle volte non raggiunge ciò che vuoi ottenere. La cosa mancante in Java è avere i parametri 'const', ma copiare ogni istanza dell'oggetto (mutabile) non è una buona soluzione. E sì, ci sono alcune cose in cui Java fa schifo, e questo è uno di questi.Usa Kotlin/classi di dati. –
Poiché il metodo clone è implementato nella classe Object a causa della sua condizione "speciale": la copia di memoria di oggetti di qualsiasi tipo.
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 dev-x:
Spesso ci si imbatte in interfacce in Java che non hanno un comportamento. In altre parole, sono solo definizioni di interfaccia vuote. Questi sono noti come interfacce marcatore. Alcuni esempi di interfacce marcatore nella Java API includono:
Non penso che sia un concetto strano. A volte è utile essere in grado di vedere se qualcosa può agire come un tipo alternativo. Come altri hanno già detto, Cloneable è rotto però. –
Dovrebbero funzionare come mixin. Non è il mio meccanismo preferito in un linguaggio fortemente tipizzato come java ma ha senso per Serializable, sorta. – wds
@Serializable avrebbe avuto più senso. O almeno lo avrebbe fatto se le annotazioni fossero arrivate un decennio prima. –
Sul progetto di lavoro su, abbiamo creato un'interfaccia chiamata PublicCloneable, contiene il metodo clone e specifica che è pubblico.
Trovo che questo sia utile: il fatto che esista un metodo di clonazione, ma non è possibile accedervi, non aiuta molto.
public interface PublicCloneable extends Cloneable {
public Object clone();
}
Quale sarebbe il modo di utilizzare questa interfaccia (PublicConeable)? – Otto
@Otto: ad esempio, un CloneHelper con un metodo public PublicCloneable copia pubblica (PublicCloneable obj), che verifica null o semplicemente copia (Object obj) e controlla sia null che instanceof PublicCloneable –
Quando si restituisce un oggetto da un locale cache per esempio ... Detto questo, serializzare/deserializzare è probabilmente più sicuro. –
- 1. Perché Intent implementa Cloneable?
- 2. C++ Cloneable mixin
- 3. CloneNotSupportedException anche durante l'implementazione Cloneable
- 4. Perché #clone() non è nell'interfaccia Cloneable?
- 5. Logica applicazione Java EE/Glassfish
- 6. Clone di overriding con e senza Cloneable
- 7. Logica reattiva basata su logica reattiva lucida
- 8. Logica lato client O logica lato server?
- 9. Logica basata sul tempo di test delle unità in Java
- 10. JAXB Java - Scrittura di file XML con logica di riavvio
- 11. Logica evento ricorrente
- 12. estensione logica proposizionale alla logica modale in Haskell
- 13. Logica aziendale e dell'applicazione?
- 14. Diagramma di architettura logica
- 15. Logica percorsi Rails
- 16. business class logica
- 17. Logica dietro pulsante Indietro
- 18. Implementare retryWhen logica
- 19. Programmazione logica a Lua?
- 20. Come ridurre un'istruzione logica?
- 21. Animazione e logica
- 22. Logica Angular2 retry
- 23. Corrispondenza logica fuzzy
- 24. Perché il metodo Object clone() è disponibile solo per le classi che implementano l'interfaccia Cloneable?
- 25. Logica alla base std :: bool_constant
- 26. Sottoinsieme data.table tramite colonna logica
- 27. Logica "riprova" rapida su richiesta
- 28. Logica mancante nell'algoritmo del filtro
- 29. Come posso implementare questa logica
- 30. Come semplificare questa logica/codice?
Il design è stupido. Mi chiedo perché Sun non abbia mai risolto questo problema. – tactoth
Perché non è stato corretto in Java 8? Non sono state rimosse/modificate parti inefficaci di Java? –
È "rotto" perché alcuni lo dicono? "Cloneable non contiene il metodo clone" Sì, e la sua documentazione non ha mai detto che sarebbe. "Ciò significa che non puoi testare se qualcosa è un'istanza di Cloneable, lanciarlo su Cloneable e invocare il clone." Di nuovo, questo non è affatto lo scopo di "Cloneable". 'Cloneable' è solo per rendere' Object.clone() 'lanciare un'eccezione o meno. Non è mai stata un'interfaccia per invocare il 'clone'. Forse sarebbe bello se Java avesse una tale interfaccia, ma la mancanza di uno non rende un'altra interfaccia ('Cloneable') interrotta. – newacct