# Copy Constructor in Java ?



## Xerxis13 (13. Apr 2011)

Hallo zusammen,

ich suche in Java eine Art Copy Constructor, wie es ihn scheinbar in C++ gibt.

Szenario:
Es gibt eine Basis Klasse, von der 2 Unterklassen abgeleitet werden:

```
public abstract class BaseClass{
public String varA;
public String varB;
}
```


```
public class SubClassA extends BaseClass{
}
```


```
public class SubClassB extends BaseClass{
}
```

Im laufe des Programmes wird SubClassA gefüllt und soll irgendwann nach SubClassB überführt werden, heißt alle Felder aus der Basisklasse sollen rüber kopiert werden.

Gibt es jetzt eine Möglichkeit dieses "automatisch" zu machen?

Es scheint uns nicht sinnvoll, einen Konstruktor ala:


```
public BaseClass(BaseClass bc){
this.varA = bc.getVarA();
this.varB = bc.getVarB();
[..]
```
zu schreiben.

Gibt es eine möglichkeit den gemeinsamen Teil beim Erzeugen einer neuen Unterklasse mit zu "übernehmen" ?


Vielen Dank,

Patrick


----------



## HoaX (13. Apr 2011)

Nö, da gibts nix fertiges für, und ich habe es auch bislang nicht vermisst.


----------



## JimPanse (13. Apr 2011)

hi,

mmm in C++ wird genauso vorgegangen! Der Copy-Konstruktor muss in C++ auch implementieren werden in Java gibt es zusätzlich noch das Zauberwort super.


```
public class SuperClass {
  protected int a,b;
  
  public SuperClass(int a, int b){
     this.a = a;
     this.b = b;
  }

// getter & setter
}

public class ChildClass extends SuperClass {

   public ChildClass(int a, int b){ 
      super(a,b);
   }

  public ChildClass(ChildClass copy){
     super(copy.getA(),copy.getB());
  }

   // oder eine methode
  public ChildClass copy(ChildClass copy){
    ChildClass c  = new ChildClass(copy);
   return c;
  }
}
```

--> C++


```
class SuperClass 
{
public:
int a,b;
SuperClass(const SuperClass &s)
{ 
 this.a = s.a;
 this.b = s.b;
}

SuperClass(int a, int b)
{
 this.a = a; 
 this.b = b;
}
};
// der Rest -> keine lust mehr gehabt ;-)
```

Wie du siehst ist der Aufwand ähnlich!


----------



## Xerxis13 (13. Apr 2011)

HoaX hat gesagt.:


> Nö, da gibts nix fertiges für, und ich habe es auch bislang nicht vermisst.



Wenn du schreibst, du hast es bisher nicht vermisst, bist du im speziellem nie in die Verlegenheit gekommen so etwas zu brauchen oder habe ich einen Denkfehler in meinem Code?


----------



## andiv (13. Apr 2011)

Der Trick in C++ ist dass Kopierkonstruktor, Zuweisungsoperatur und Destruktor automatisch generiert werden und völlig ausreichen falls keine Zeiger/Referenzen verwendet werden. Den Ärger den man in Java ab und an mal hat, dass ein Objekt von mehreren Stellen referenziert wird und man es deshalb nicht verändern kann/darf/soll und man sich mühevoll eigenen Kopiercode schreiben muss, hat man in C++ also seltener. Ausnahme: Man programmiert C++ wie Java und nutzt nur Zeiger und dynamische Speicherverwaltung, dann hat man den gleichen Ärger, aber in meinen Augen C++ auch nicht verstanden.

@Threadstarter: Klingt nach einem Designfehler. Verwende lieber Komposition statt Vererbung! Dann kannst du den Basisklassenanteil einfach von ClassA nach ClassB weiterreichen.


----------



## maki (13. Apr 2011)

Copy Konstruktoren nutzt man in Java selten, immutables sind besser (ständig Kopien erzeugen ist wohl nicht immer das beste ) und sicherer wenn es darum geht Alisaing Probleme zu vermeiden. 

Falls man doch sowas brauchen sollte nimmt man eine Factory Methode und kann dem Ding einen Namen geben, siehe auch Blochs "Effective java 2nd Edition" dazu.



> Es scheint uns nicht sinnvoll, einen Konstruktor ala:
> 
> ```
> public BaseClass(BaseClass bc){
> ...


Doch, genau das ist sinnvoll, oder woher sollte der Compiler wissen wie diese Objekte zu kopieren sind?

In Java nutzt man halt Referenzen, was nix anderes ist als ein Zeiger, der eben auf ein Objekt zeigt oder auf null.


----------



## Wildcard (14. Apr 2011)

Normal ist sowas fast nur im Kontext eines Datenmodells sinnvoll, daher würde ich (wie immer :bae einen Blick auf EMF empfehlen. EMF Modelle lassen sich, da sie formal beschrieben sind, problemlos automatisch je nach Bedarf shallow oder deep kopieren.
Eclipse Modeling Framework ? Wikipedia


----------



## Xerxis13 (14. Apr 2011)

Ich danke vielmals für die Zahlreichen Beiträge und die damit verbundene Hilfe. Werde mir das EMF mal anschauen und meine Logik nochmal überdenken.

Vielen Dank euch allen.


----------

