Warum wurde die .clone()
-Methode nicht in der java.lang.Cloneable
-Schnittstelle angegeben?Java: Grundprinzip der Cloneable-Schnittstelle
Antwort
Im Grunde ist es eine defekte Schnittstelle. Ken Arnold und Bill Venners besprachen es in Java Design Issues.
Arnold:
Wenn ich an dieser Stelle Gott sein waren, und viele Menschen sind wahrscheinlich froh, dass ich nicht bin, würde ich sagen,
Cloneable
deprecate undCopyable
haben, weilCloneable
Probleme hat. Neben der Tatsache, dass es falsch geschrieben ist, enthältCloneable
nicht dieclone
Methode. Das heißt, Sie können nicht testen, ob etwas eine Instanz vonCloneable
ist, es inCloneable
umwandeln undclone
aufrufen. Sie müssen wieder Reflexion verwenden, was schrecklich ist. Das ist nur ein Problem, aber eines würde ich sicherlich lösen.
Sehen Sie diesen Fehler in der Java Bugdatenbank:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4098033
Im Wesentlichen ist ein Konstruktionsfehler in früheren Versionen von Java, dass sie nicht, wie in der klonbar Schnittstelle zu beheben beabsichtigen, dies zu tun würde Kompatibilität mit vorhandenem Code unterbrechen.
Ich frage mich, warum sie den 'Copyable' Schnittstelle zu Java 1.2 und darüber hinaus nicht hinzugefügt haben ... – EpicPandaForce
@EpicPandaForce Wahrscheinlich, weil wir nicht wollen, C++ in bestimmten Situationen zu imitieren. Klonen sollte mit Vorsicht verwendet werden, die meiste Zeit erreicht es nicht das, was Sie erreichen wollen. Die fehlende Sache in Java ist, "konstante" Parameter zu haben, aber das Kopieren jeder (veränderbaren) Objektinstanz ist keine gute Lösung. Und ja, es gibt einige Dinge, in denen Java saugt, und das ist einer von ihnen.Verwenden Sie Kotlin/Datenklassen. –
Da die Klon-Methode aufgrund ihrer "besonderen" Bedingung in der Object-Klasse implementiert ist: die Speicherkopie von Objekten jeglicher Art.
In Java gibt es dieses Konzept der Marker-Schnittstellen. Die Schnittstelle Cloneable
hat keine Methoden oder Felder und dient nur dazu, die Semantik der Klonbarkeit zu identifizieren.
von der dev-x Webseite:
Oft werden Sie Schnittstellen in Java kommen über die kein Verhalten. Mit anderen Worten, sie sind nur leere Schnittstellendefinitionen. Diese sind als Marker-Schnittstellen bekannt. Einige Beispiele für Marker-Schnittstellen in der Java-API sind:
Ich glaube nicht, dass es ein komisches Konzept ist. Manchmal ist es nützlich zu sehen, ob etwas als alternativer Typ fungieren kann. Wie andere gesagt haben, ist Cloneable jedoch kaputt. –
Sie sollten als Mixins fungieren. Nicht mein Lieblingsmechanismus in einer stark typisierten Sprache wie Java, aber es macht Sinn für Serializable, sorta. – wds
@Serializable hätte mehr Sinn gemacht. Oder zumindest hätte es getan, wenn Anmerkungen ein Jahrzehnt früher kommen würden. –
Auf dem Projekt arbeite ich an, haben wir eine Schnittstelle namens PublicCloneable, erstellt sie die Klon-Methode enthält und gibt an, dass es öffentlich ist.
Ich finde dieses eine nützlich: die Tatsache, dass es eine Klonmethode gibt, aber Sie nicht darauf zugreifen können, hilft nicht sehr viel.
public interface PublicCloneable extends Cloneable {
public Object clone();
}
Wie würde man diese Schnittstelle (PublicConeable) benutzen? – Otto
@Otto: zum Beispiel, ein CloneHelper mit einer Methode public static PublicCloneable Kopie (PublicCloneable obj), die auf Null prüft, oder nur kopieren (Object obj), und überprüft sowohl Null und instanceof PublicCloneable –
Wenn Sie ein Objekt von einem lokalen zurückgeben Cache zum Beispiel ... Serialisierung/Deserialisierung ist wahrscheinlich sicherer. –
- 1. Was ist das Grundprinzip hinter dem gemischten Druckverhalten von XmlDocument?
- 2. verwendet window.onload zum Ausführen einer anonymen Funktion das gleiche Grundprinzip wie das Modulmuster?
- 3. Java Klassenname, der mit Java beginnt
- 4. Testen der Java-Karteneinheit
- 5. Hintergrund der JAVA-Farbkomponente
- 6. Ändern der Java-Version
- 7. Funktioniert der Operator Java & = & & &&?
- 8. Java Reimplementierung der ==
- 9. Java Zuordnung der Schnittstelle
- 10. Zweck der Hauptmethode in der Java-Webanwendung
- 11. Der seltsame Fall der „if“ in Java
- 12. Überprüfen der Komponentenhierarchie in der Java-Benutzeroberfläche
- 13. Verhalten der Java-Array-Schleife
- 14. Eingabe der Eingabefehler in Java
- 15. Reihenfolge der Initialisierung in Java
- 16. Java - Größe der Komprimierungsausgabe-ByteArray
- 17. Java Swing - Manipulation der GUI
- 18. java - Funktion in der Klasse
- 19. Beste Implementierung der Java-Warteschlange?
- 20. Java mit der vergleichbaren Schnittstelle
- 21. Rechenzeit der Simulation in Java
- 22. Java-Objektkonstruktor, der "null" zurückgibt
- 23. Wie funktioniert der Java-Operator?
- 24. Unterschied in der Ausgabe - Java
- 25. Verwenden der Eingabeaufforderung mit Java
- 26. Überwachung der Systemressourcennutzung für Java
- 27. Ersetzen Strings in der Java
- 28. Beschleunigung der Pixelerkennung in Java
- 29. Arraylist der Unterklassen in Java
- 30. der Zukunft Klärung in Java
Das Design ist albern. Ich frage mich, warum Sun das nie repariert hat. – tactoth
Warum wurde es in Java 8 nicht behoben? Wurden nicht bereits gebrochene/ineffektive Teile von Java entfernt/verändert? –
Es ist "kaputt", weil ein paar Leute das sagen? "Cloneable enthält nicht die Klonmethode" Ja, und die Dokumentation hat es nie gesagt. "Das heißt, Sie können nicht testen, ob etwas eine Instanz von Cloneable ist, es in Cloneable umwandeln und clone aufrufen." Auch das ist nicht der Zweck von 'Cloneable'. 'Cloneable' dient nur dazu,' Object.clone() 'eine Ausnahme auszulösen. Es war nie eine Schnittstelle für Sie, um Klon aufzurufen. Vielleicht wäre es schön, wenn Java ein solches Interface hätte, aber das Fehlen von einem macht keine andere Schnittstelle ("Cloneable") kaputt. – newacct