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 .

16voto

Kathy Van Stone Punkte 24475

Effective Java empfiehlt eine der folgenden Möglichkeiten:

  1. Ein Kopierkonstruktor (wie von anderen bemerkt):

    public Item(Item item)

  2. Eine Kopierwerkmethode:

    public static Item newInstance(Item item)

(Auch kein Kopieren bei unveränderlichen Objekten)

Der Hauptunterschied besteht darin, dass Sie bei Nr. 1 die tatsächliche Klasse des Ergebnisses wählen, während bei Nr. 2 der Implementierer eine Unterklasse zurückgeben kann. Die Semantik der Klasse kann Ihnen dabei helfen, die beste Lösung zu finden.

3voto

Yishai Punkte 87548

Ich würde es eine Kopiermethode oder einen Kopierkonstruktor (je nach Fall) nennen. Wenn es sich um eine statische Methode handelt, würde ich sie als Fabrik bezeichnen.

Die flexibelste und langlebigste Option ist ein Kopierkonstruktor. Dieser gibt Unterklassen die Möglichkeit, sich selbst zu kopieren, genau wie die Elternklasse.

2voto

Ich würde einen Konstruktor machen

...
public Thing(Thing copyFrom)
{
    attr1 = copyFrom.attr1;
    attr2 = copyFrom.attr2;
    //etc...
}

Wenn Sie es dann klonen wollen

Thing copy = new Thing(copy from me);

0voto

Mnementh Punkte 48509

Sie können die [klonen()](http://java.sun.com/javase/6/docs/api/java/lang/Object.html#clone()) -Methode, wenn Sie wollen. Eine andere gängige Praxis ist ein Konstruktor, der ein Objekt dieses Typs annimmt, d.h. new ArrayList(anotherList) .

0voto

Nick Holt Punkte 32407

Sie haben ein paar Möglichkeiten, die Sie umsetzen können Cloneable fügen Sie einen Kopierkonstruktor hinzu, aber ich bevorzuge eine Methode (statisch oder Instanz), die einen Namen hat, der beschreibt, was der Kopiervorgang tut - ist es eine tiefe oder flache Kopie usw.

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