Avatar billede erikanton Nybegynder
05. januar 2004 - 19:11 Der er 11 kommentarer og
1 løsning

Hvad gør clone?

Hejsa

Sidder med følgende kode-stump:

timer = new Time[blokke];
for (int i = 0; i < blokke; i++) {
timer[i] = new Time(Color.gray, gregC, "");
this.add(timer[i]);
timer[i].addMouseListener(muselytter);
gregC = (GregorianCalendar) gregC.clone();
gregC.add(Calendar.MINUTE, 30);


Nogen der kan fortælle mig hvad clone helt nøjagtigt gør her, og måske endda hvad man generelt bruger det til?

Det ville bare være herligt...
Avatar billede jakoba Nybegynder
05. januar 2004 - 19:30 #1
.clone() metoden laver en kopi af det objekt den kaldes i.

Obj A = new Obj();
A.intProperty = 25;
Obj B = A:            // A og B er samme instans af et Obj objekt
Obj C = (Obj)A.clone();    // C er en ny Obj instans

A.intProperty = 5;
System.out.println( "B.intProperty = " +B.intProperty ); // skriver nu 5
System.out.println( "C.intProperty = " +C.intProperty ); // skriver stadig 25

mvh JakobA
Avatar billede arne_v Ekspert
05. januar 2004 - 21:27 #2
Jakob har forklaret hvad clone gør.

Det er meget at være opmærksom på at clone normalt laver en
shallow clone og ikke en deep clone !
Avatar billede arne_v Ekspert
05. januar 2004 - 21:28 #3
public class ShallowCloneEx {
    public static void main(String[] args) throws Exception {
        MyObj x1 = new MyObj(1, "A");
        MyObj x2 = (MyObj)x1.clone();
        x2.add(2, "B");
        System.out.println(x1);       
        System.out.println(x2);       
    }
}

class MyObj implements Cloneable {
    private int i;
    private StringBuffer sb;
    public MyObj() {
    }
    public MyObj(int i, String s) {
        this.i = i;
        this.sb = new StringBuffer(s);
    }
    public String toString() {
        return (i + " " + sb);
    }
    public void add(int i, String s) {
        this.i += i;
        this.sb.append(s);
    }
    public Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}

giver:

1 AB
3 AB
Avatar billede arne_v Ekspert
05. januar 2004 - 21:28 #4
public class DeepCloneEx {
    public static void main(String[] args) throws Exception {
        MySpecialObj x1 = new MySpecialObj(1, "A");
        MySpecialObj x2 = (MySpecialObj)x1.clone();
        x2.add(2, "B");
        System.out.println(x1);       
        System.out.println(x2);       
    }
}

class MySpecialObj implements Cloneable {
    private int i;
    private StringBuffer sb;
    public MySpecialObj() {
    }
    public MySpecialObj(int i, String s) {
        this.i = i;
        this.sb = new StringBuffer(s);
    }
    public String toString() {
        return (i + " " + sb);
    }
    public void add(int i, String s) {
        this.i += i;
        this.sb.append(s);
    }
    public Object clone() throws CloneNotSupportedException {
        return new MySpecialObj(i, sb.toString());
    }
}

giver:

1 A
3 AB
Avatar billede arne_v Ekspert
05. januar 2004 - 21:29 #5
Den shallow clone laver kun en klon af referancen til StrinBuffer'en som
derfor peger på samme objekt.

Den deep clone får også lavet et nyt StringBuffer objekt.
Avatar billede erikanton Nybegynder
06. januar 2004 - 20:14 #6
Point?
Avatar billede arne_v Ekspert
06. januar 2004 - 20:16 #7
Jakob er først i køen !
Avatar billede arne_v Ekspert
23. januar 2004 - 22:23 #8
?
Avatar billede jakoba Nybegynder
23. januar 2004 - 22:29 #9
Sorry, ikke til mig her.
Avatar billede arne_v Ekspert
23. januar 2004 - 22:31 #10
Dit svar er da korrekt !
Avatar billede normann1974 Nybegynder
22. februar 2004 - 21:19 #11
Jeg mener personligt, at man skal passe på med at bruge clone()-metoderne i Java, især pga. hele diskussionen ovenfor med deep og shallow clones.

Man kan principielt ikke vide noget som helst om, hvad der kommer retur fra metoden, kun at det er meningen er, at der kommer et andet, identisk objekt ud, som det, metoden kaldes på. Det kan dog godt være, at det objekt, der kommer ud, er af en anden klasse, fx en superklasse, fx hvis man har glemt at implementere clone()-metoden i en klasse, der nedarver fra en anden klasse, hvor clone() er implementeret. Det sker alt for ofte, og derfor kan det meget vel ske, at objekt.equals(objekt.clone()) ikke engang er sand...
Avatar billede arne_v Ekspert
22. februar 2004 - 21:27 #12
Hvis Jakob ikke vil have, så ...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester