2010-03-23 10 views
24

Ich versuche, eine tiefe Kopie eines Objekts, einschließlich einer GregorianCalendar Instanz zu machen. Ich bin immer vorsichtig, clone() zu verwenden, und es scheint hier nicht übersteuert worden zu sein, also mache ich nur die Kopie Feld für Feld. Idealerweise würde es eine Copykonstruktor sein, die ich wie so verwenden könnte:Schnellste Möglichkeit, einen Gregorianischen Kalender zu klonen?

GregorianCalendar newCalendar = new GregorianCalendar(oldCalendar); 

Leider ein finde ich, kann keine solche Funktionalität in der API und versuchen bin stecken, um herauszufinden, welche Felder wir müssen exakte Kopie. Also, um eine Kopie von einem dieser Kalender zu machen, wie würdest du es tun? Fehle ich hier eine einfache Abkürzung?

Antwort

36

java.util.Calendar hat clone(), die funktioniert, außer Kraft gesetzt, so dass es verwenden. Außerdem hat Calendar keine tiefe Datenhierarchie - seine Daten sind hauptsächlich int s.

die Antwort zu erweitern, Sie SerializationUtils.clone(..) (von commons-lang) auf einem beliebigen Objekt, das eine tiefe Kopie macht nennen kann, wenn die Hierarchie gesamte Daten Serializable

+0

ich nicht ganz klar war, warum ich vermeiden 'Klon()'. In diesem Fall folge ich nur dem Rat von Joshua Bloch, defensive Kopien zu machen. Da clone() möglicherweise eine Unterklassen klon() -Methode aufrufen könnte, könnte ich mit einer nicht sauberen Kopie enden. Ein bisschen akademisch in meinem Fall, aber deshalb habe ich es vermieden. – wds

+0

Wie ich schon sagte, die Daten im Kalender sind nicht von diesem Problem betroffen - alle Daten sind primitiv. Und die Klonmethode in "Calendar" funktioniert gut. – Bozho

+0

Sein Punkt ist, dass Sie möglicherweise eine Unterklasse erstellen können, die einen Verweis auf die ursprüngliche Kalenderinstanz behält und diese Referenz herum behält. Wenn beispielsweise alle Setter Werte in der ursprünglichen Instanz anstelle der neuen setzen, wird Ihre "tiefe" Kopie jetzt kompromittiert. – wds

-7

Uh implementiert, saugt clone().

Ist es so schwer? Sie müssen nur 3 Dinge, glaube ich, die Zeit, die Zeitzone und das Gebietsschema einstellen. Alle diese Felder haben Getter und Setter. Machen Sie eine recht nützliche Methode, um eine Kopie zurückzugeben?

+0

Ich verstehe nicht; Da sowohl Calendar als auch GregorianCalendar benutzerdefinierte Clone-Methoden implementieren, warum ist es nicht sinnvoll, sie zu verwenden? –

+0

Härte Fehlschlag. Gute Programmierer sind faul. –

0

Insbesondere die schnellste Codezeile einen Kalender zu kopieren ist:

GregorianCalendar newCalendar = (Calendar)(oldCalendar.clone());