Kopierkonstruktor

DerEisige

Erfahrenes Mitglied
Guten morgen leute,

ich habe eine frage, wie sieht der Kopierkonstruktor für diese klasse aus?

Bin mir unsicher wegen dem Array

Code:
public class A {
private int at1;
private String at2;
private B[] bs;

   public A(A a) {
       this.at1 = a.getAt1();
       this.at1 = a.getAt2();
       this.
   }
}
 

sheel

I love Asm
Hi

Falls getA1 usw. auch existieren, und eben eine "tiefe" Kopie von allem gemacht werden soll (manchmal kann es auch Sinn machen, dass sich alle Kopien doch die selben Daten teilen (entweder das ganze Array oder die einzelnen Elemente)):
Java:
public A(A a) {
    this.at1 = a.getAt1();
    this.at1 = a.getAt2();
    int len = a.getBs().length;
    this.bs = new B[len];
    for(--len; len >= 0; len--)
    {
        if(a.getBs()[len] != null)
            this.bs = new B(a.getBs()[len]);
    }
}
Statt der Rückwärts-Schleife könnte man auch ein i von 0 bis len laufen lassen, braucht eben eine Variable mehr.
 

Bratkartoffel

gebratene Kartoffel
Premium-User
Hi,

primitive Typen wie String, int, double usw, aber auch Box-Primitive (Integer, Long, Double) lasst sich ganz einfach klonen / kopieren. Diese sind alle immutable, das heisst bei einer Wertänderung wird ein neues Object erstellt. Von daher kannst du einfach per a=b "klonen".

Bei einem Array aus primitiven Typen kannst du per Arrays.copyOf() eine Kopie erstellen.

Bei anderen Objekten oder Arrays sieht die Sache etwas komplizierter aus. Hier musst du analog zu deinem A auch einen Copy-Contructor machen oder das Cloneable-Interface implementieren. Siehe hierzu aber auch diesen Hinweis.

Grüsse,
BK
 

DerEisige

Erfahrenes Mitglied
habe jetzt doch noch eine frage und zwar wie mache ich das wenn ich keine geter und seter habe wie in der classe.

Code:
public class B {
    private int at1;
    private int at2;
    private int at3;

    public B(int at1, int at2, int at3) {
        this.at1 = at1;
        this.at2 = at2;
        this.at3 = at3;
    }

    public B(B b) { // Kopierkonstruktor // zu vervollstaendigen (siehe unten)
    }

    @Override
    public B clone() {
        try {
            B b = (B) super.clone();
            return b;
        } catch (CloneNotSupportedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
       
    }

    @Override
    public String toString() {
        return "B [at1=" + at1 + ", at2=" + at2 + ", at3=" + at3 + "]";
    }

}
 

sheel

I love Asm
Ein B-Objekt kann auf Werte eines anderen B-Objekts zugreifen, auch wenn sie private sind.
Wenn es kein b.getAt1() gibt geht daher auch b.at1

edit: 9 Jahre :D
 
Zuletzt bearbeitet: