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...
Annonceindlæg tema
Forsvar & beredskab
Cybersikkerhed, realtidsdata og robuste it-systemer er blevet fundamentet for moderne forsvar.
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
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 !
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
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
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.
06. januar 2004 - 20:14
#6
Point?
06. januar 2004 - 20:16
#7
Jakob er først i køen !
23. januar 2004 - 22:23
#8
?
23. januar 2004 - 22:29
#9
Sorry, ikke til mig her.
23. januar 2004 - 22:31
#10
Dit svar er da korrekt !
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...
22. februar 2004 - 21:27
#12
Hvis Jakob ikke vil have, så ...
Kurser inden for grundlæggende programmering