11 Stimmen

Wenn Sie nicht in Java klonen, was tun Sie dann und wie nennen Sie es?

Hat jemand irgendwelche Vorschläge oder bewährte Verfahren und Namenskonventionen für Kopierkonstruktoren / Fabrikmethoden usw. in Java? Insbesondere, sagen wir, ich habe eine Klasse Thing und ich möchte irgendwo eine Methode, die eine neue Thing mit demselben Wert wie a Thing übergeben (oder als Instanz, wenn es sich um eine Instanzmethode handelt). Würden Sie dies als Konstruktor oder eine statische Fabrikmethode oder Instanzmethode haben? Wie würden Sie es nennen?

Wie der Titel schon sagt, möchte ich Folgendes vermeiden clone() y Cloneable .

0voto

Apocalisp Punkte 34088

使用方法 unveränderliche Datenstrukturen . Der einzige Grund, warum Sie das Gefühl haben, dass Sie clone() ist, dass Sie Ihre Objekte an Ort und Stelle mutieren. Hören Sie auf, das zu tun. Überlegen Sie, wie Sie das können:

  • Machen Sie Ihren Unterricht endgültig.
  • Machen Sie Felder in Ihren Klassen endgültig und privat.

Hier ist zum Beispiel ein "Setter" für ein unveränderliches 3D-Vektorobjekt:

public Vector3D setX(double x) {
  return new Vector3D(x, this.y, this.z);
}

Ich denke, was ich damit sagen will, ist... Ich verwende Kopierkonstruktoren anstelle von Mutation, und ich benenne sie einfach nach dem Attribut, das ich ändern möchte.

0voto

finnw Punkte 46519

Eine andere Möglichkeit ist die Implementierung der Kopiermethode in der Quelle Objekt, z.B.:

interface Has3DCoords {
    void setLocation(double x, double y, double z);

    void copyCoordsTo(Has3DCoords dest);
}

Sie würden dann das Kopieren mit einem Stück Code wie implementieren:

class Thing implements Has3DCoords {
    private Point3D loc;
    // ...

    void setLocation(double x, double y, double z) {
        loc.setLocation(x, y, z);
        // or: loc = new Point3D(x, y, z);
    }

    void copyCoordsTo(Has3DCoords dest) {
        loc.copyCoordsTo(dest);
        // or: dest.setLocation(loc.getX(), loc.getY(), loc.getZ());
    }

    OtherThing createOtherThing() {
        OtherThing result = new OtherThing();
        this.copyCoordsTo(result);
        return result;
    }
}

Dies kann nützlich sein, wenn:

  • Es macht keinen Sinn, das gesamte Objekt zu klonen
  • Es gibt eine Gruppe von verwandten Eigenschaften, die oft als eine Einheit kopiert werden
  • Sie wollen nicht aufdecken loc als eine Eigenschaft von Thing
  • Die Anzahl der Eigenschaften ist groß (oder es gibt viele solcher Gruppen), so dass ein Konstruktor, der alle diese Eigenschaften als Parameter benötigt, unhandlich wäre.

0voto

pjp Punkte 16064

Dies ist nicht die schönste Methode, um Objekte zu kopieren, aber das Folgende ist manchmal nützlich, wenn Sie eine tiefe Kopie eines Serialisierbar Objekt. Dies erspart das Schreiben von Kopierkonstuktoren, die Implementierung von Cloneable oder das Schreiben von Fabrikklassen.

ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(bos);

//Serializes the input object
oos.writeObject(input);

ByteArrayInputStream bais = new ByteArrayInputStream(bos.toByteArray());
ObjectInputStream ois = new ObjectInputStream(bais);

//Copy of the input object
Object output = ois.readObject();

Vergessen Sie nicht, die Ausnahmen zu behandeln und die Streams sauber zu schließen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X