Copy Constructor in Java ?

Xerxis13

Mitglied
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:
Java:
public abstract class BaseClass{
public String varA;
public String varB;
}
Java:
public class SubClassA extends BaseClass{
}
Java:
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:

Java:
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
 
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.

Code:
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++

Code:
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!
 
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.
 
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:
Code:
public BaseClass(BaseClass bc){
this.varA = bc.getVarA();
this.varB = bc.getVarB();
[..]
zu schreiben.
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.
 
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.
 

Zurück
Oben