Copy - Constructor vs clone()

Diskutiere Copy - Constructor vs clone() im Java Basics - Anfänger-Themen Bereich.
S

Schuriko

Mir geht gerade die Frage durch den Kopf Copy-Constructor oder doch eher clone(). Im Prinzip machen es beide Funktionen ja gleich. Was bevorzugt ihr und warum?
 
mrBrown

mrBrown

Copy-Constructor, weil clone einfach eine sehr hässliche API ist :)
 
J

JustNobody

Das Thema hatten wir neulich in einem anderen Thread und wenn man gegen Interfaces entwickelt, dann geht das mit dem clone() auch nicht mehr.
Wenn man z.B. mir ArrayLists arbeitet, dann hat man nach außen meist einfach ein List. Bei List hast du kein clone().
Der Konstruktor geht aber immer schön, da dieser einfach eine Collection nimmt.
 
S

Schuriko

Darf ich dazu nochmal etwas einwenden? Bei einem Copy-Constructor übergibt man eine Klasse zum kopieren. D.h. im Programm selbst könnte auch null übergeben werden, was theoretisch absolut legitim wäre, allerdings zu keiner kopie führen kann. Bei einem clone() würde ja schon die instanzierte Klasse zurückgegeben.
 
mrBrown

mrBrown

Darf ich dazu nochmal etwas einwenden? Bei einem Copy-Constructor übergibt man Klasse zum kopieren. D.h. im Programm selbst könnte auch null übergeben werden, was theoretisch absolut legitim wäre, allerdings zu keiner kopie führen kann. Bei einem clone() würde ja schon die instanzierte Klasse zurückgegeben.
Bei einem clone würde dann eine NPE fliegen, bei einem Copy-Construktor kann man wenn möglich dann sinnvolle Default-Werte setzen.
 
J

JustNobody

Was ist ein NPE? Meinst du einen NullPointerException? Aber wieso sollte dieser von einer clone() - funktion ausgelöst werden?
Wenn du eine Methode (hier clone) auf einer Null Variablen aufrufst, dann kommt eine NPE.

Die Problematik ist also in beiden Fällen ähnlich.
 
S

Schuriko

Ich habs mal in meinem Projekt umgesetzt. Hierbei ist mir doch noch eine Frage bezüglich Copy-Constructor eingefallen. Wie würdet ihr vorgehen, bei einer Klasse. Also zum besseren Verstehen: Angenommen in der übergebenen Klasse befindet sich eine Instanz einer anderen Klasse z.B. wie folgt
Code:
class ClassA {
     ....
}

class ClassB {
    private ClassA;
    
    public ClassB(ClassB b) {
        ....
    }
}
würdet ihr dann in dem Konstruktur von ClassB eine neue Instanz von ClassA erzeugen. Oder würdet ihr die Klasse einfach so übernehmen? Denn angenommen die Instanz ClassA wird an einer Instanz von ClassB eingefügt werden, weil dann würde doch wenn ich die Instanz ClassA aus einem der beiden Klassen B lösche auch für die andere Instanz nicht mehr zur Verfügung stehen.
 
mrBrown

mrBrown

würdet ihr dann in dem Konstruktur von ClassB eine neue Instanz von ClassA erzeugen. Oder würdet ihr die Klasse einfach so übernehmen?
Kommt drauf an, manchmal braucht man eine tiefe Kopie, machmal eine flache. Pauschal lässt sich das nicht entscheiden, meist reicht aber eine flache.

Denn angenommen die Instanz ClassA wird an einer Instanz von ClassB eingefügt werden, weil dann würde doch wenn ich die Instanz ClassA aus einem der beiden Klassen B lösche auch für die andere Instanz nicht mehr zur Verfügung stehen.
Keine Ahnung ob ich dich richtig verstehe, aber solange eine Instanz irgendwo noch benötigt wird, wird sie nicht gelöscht.

Wenn zwei Instanzen von B auf das gleiche A zeigen (B1-->A<--B2), ist egal wie sich eines der Bs ändert, weder ein löschen von A in einer Instanz (B1, B2-->A) ändert was an der anderen, noch wenn man ein zweites A einführt (B1-->A1, B2-->A2).
 
Thema: 

Copy - Constructor vs clone()

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben