2009-04-02 11 views

Antwort

36

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 und Copyable haben, weil Cloneable Probleme hat. Neben der Tatsache, dass es falsch geschrieben ist, enthält Cloneable nicht die clone Methode. Das heißt, Sie können nicht testen, ob etwas eine Instanz von Cloneable ist, es in Cloneable umwandeln und clone aufrufen. Sie müssen wieder Reflexion verwenden, was schrecklich ist. Das ist nur ein Problem, aber eines würde ich sicherlich lösen.

+0

Das Design ist albern. Ich frage mich, warum Sun das nie repariert hat. – tactoth

+0

Warum wurde es in Java 8 nicht behoben? Wurden nicht bereits gebrochene/ineffektive Teile von Java entfernt/verändert? –

+3

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

10

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.

+0

Ich frage mich, warum sie den 'Copyable' Schnittstelle zu Java 1.2 und darüber hinaus nicht hinzugefügt haben ... – EpicPandaForce

+0

@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. –

1

Da die Klon-Methode aufgrund ihrer "besonderen" Bedingung in der Object-Klasse implementiert ist: die Speicherkopie von Objekten jeglicher Art.

6

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:

+1

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. –

+0

Sie sollten als Mixins fungieren. Nicht mein Lieblingsmechanismus in einer stark typisierten Sprache wie Java, aber es macht Sinn für Serializable, sorta. – wds

+5

@Serializable hätte mehr Sinn gemacht. Oder zumindest hätte es getan, wenn Anmerkungen ein Jahrzehnt früher kommen würden. –

5

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(); 
} 
+1

Wie würde man diese Schnittstelle (PublicConeable) benutzen? – Otto

+0

@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 –

+0

Wenn Sie ein Objekt von einem lokalen zurückgeben Cache zum Beispiel ... Serialisierung/Deserialisierung ist wahrscheinlich sicherer. –