Aufbau eines copy-Konstruktor in Java
Wie Baue ich einen copy-Konstruktor erhält einen weiteren Punkt (x,y) und eine Kopie der Werte ?
Ich entscheiden, Signatur: public Point1 (Point1 other)
, aber ich weiß nicht, was zu schreiben, es...
Die Point-Klasse sieht wie folgt aus:
public class Point1
{
private int _x , _y;
public Point1 (Point1 other)
{
...
...
}
//other more constructors here...
}
Habe ich versucht:
public Point1 (Point1 other)
{
_x = other._x ;
_y = other._y;
}
Aber ich fast sicher, dass ich es besser machen können..
thnx
- C, ich denke du meinst zu haben
public Point1(Point1 other)
in Ihren Beispielen, nicht? - Ein
Point
ist ein Beispiel von etwas, das oft sollte unveränderlich sind, in dem Fall tatsächlich das kopieren nicht notwendig werden würde. - Warum denken Sie, sollte es einen anderen Weg? Alle ein copy-Konstruktor ist eigentlich zu tun ist, kopieren Sie die Werte des anderen Objekts Felder.
- es gibt viele Beispiele, wo unveränderliche Objekte können dupliziert. Wandlungsfähigkeit zu tun hat mit der Fähigkeit zu ändern, die Daten, es ist nicht eine Garantie der Einzigartigkeit der übergeordneten Instanz.
String a = new String("a"); String a2 = new String("a");
- Ich sage nicht, dass der Unveränderlichkeit impliziert nichts über die Eindeutigkeit der Instanzen, nur, dass es keinen Sinn im erstellen einer Kopie von einem unveränderlichen Objekt. Was nützt die Schaffung absichtlich 2 verschiedene Objekte für "a" zu tun?
- Gut, wir könnten erstellen, die basierend auf standard-Eingabe, statt die Leistung Treffer zu überprüfen, um zu sehen, ob es bereits geladen ist (über eine Technik, die ähnlich String.intern). Zusätzlich, code, macht häufige Verwendung mehrerer class loader entsorgen können Duplikate sicher, ob Sie existieren in unterschiedlichen class-loader (und die Konstruktion verhindert die Flucht aus der class-loader). Tomcat ist ein paar Elemente in Sitten ähnlich zu dieser Technik.
- Ich denke, Sie ist noch gar nicht mich zu verstehen. Ich sage nicht, dass
String
s muss immer ein Praktikum (oder etwas ähnliches), weil das zwei verschiedeneString
s mit dem gleichen Inhalt ist schlecht. Das ist es nicht. Ich sage, dass, wenn Sie bereits eineString
bewusst die Schaffung einer anderenString
Objekt mit dem gleichen Inhalt (mit Hilfe der copy-Konstruktor) ist sinnlos. Eine andere LesenString
mit dem gleichen Inhalt von einembyte[]
oder was auch immer ist in Ordnung. - Ich würde argumentieren, dass die Zeichenfolge sollte nicht die
String(String)
Konstruktor für den gleichen Gründen, die "ColinD" hingewiesen hat.
Du musst angemeldet sein, um einen Kommentar abzugeben.
NÖ, Ihr Versuch
ist absolut in Ordnung... (ich habe es korrigiert den parameter Typ.)
Ich würde geneigt sein, um
_x
und_y
final, und stellen Sie die Klasse final, aber das ist, weil ich wie unveränderliche Typen. Andere haben sicherlich andere Meinungen 🙂Klonen auf eine Vererbungshierarchie ist etwas schwieriger - jede Klasse in der Hierarchie zu haben, die einen entsprechenden Konstruktor übergeben Argumentation-es ist angesichts des superclass-Konstruktors, und kopieren Sie dann nur auf Ihre eigenen Felder. Zum Beispiel:
Dass es nicht so schlimm auf die Umsetzung, aber wenn Sie wollen, treu zu Klonen, eine
Point2
müssen Sie wissen es ist einPoint2
um den richtigen Konstruktor.Umsetzung
Cloneable
dies zulässt, ein bisschen mehr einfach, aber es gibt andere Dinge zu beachten, etwa, dass... im Grunde Objekte Klonen ist nicht so einfach, wie es erscheinen mag 🙂 (ich bin sicher, es gibt einen Eintrag in der Effektiven Java für Sie. Wenn Sie nicht über eine Kopie, kaufen Sie jetzt.)