26. juli 2004 - 22:09Der er
12 kommentarer og 1 løsning
java.lang.Object clone() virker ikke som forventet
.. eller også har jeg gjort det forkert. Jeg har en klasse, som jeg har ladet implementere clonable - det er også den klasse, jeg gerne vil have en kopi af fordi jeg skal bruge en reference til samme data 2 steder, men sker der ændringer det ene sted må det ikke få indflydelse på layoutet det andet sted. Altså sådan umiddelbart. .....
Det er kort sagt en klasse indeholdende noget layout kode på et JPanel, som jeg skal bruge 2 steder. Ved opstart af min app, laver jeg en instans af den klasse med gui koden i. KLassen tilføjer nogle knapper til et panel og lægger dette panel i et scrollpane.
I den ene klasse, hvor jeg skal bruge min layout kode er der ikke noget på mit panel, fordi den anden klasse (der også skal bruge koden) har hugget hele objektet.
Kan det ikke nok lade sig gøre at lave en clone() af gui klassen, så jeg undgår reduntant kode et af stederne.
Jeg skal også bruge noget data fra jr i Configuration, men jeg har ingen ide om det har indflydelse på layoutet i Configuration. Jeg menter, jeg med de 2 kloner ville have 2 kloner, men nej ....
ok her er clone metoden public Object clone() { try { return super.clone(); } catch (CloneNotSupportedException e) { throw new InternalError("But we are Cloneable!!!"); } }
Hvis jeg så har et felt der hedder String hejsa="hejsa"; hvordan clones() det så?
Object clone er en såkaldt shallow clone. Du ønsker en deep clone.
Fra docs af Object clone:
Otherwise, this method creates a new instance of the class of this object and initializes all its fields with exactly the contents of the corresponding fields of this object, as if by assignment; the contents of the fields are not themselves cloned. Thus, this method performs a "shallow copy" of this object, not a "deep copy" operation.
det vil sige at hvis man ikke laver en deep clone så er det det samme som at sætte en reference lig en anden? objekt1 o; objekt2 o2; o2=o; Hvis jeg laver ændringer i o2, sker det samme i o, er det ikke rigtigt?
En shallow clone laver faktisk et nyt objekt. Alle felter som er simple data typer bliver clonet, men alle felter som er objekter cloner man kun referencen.
Med en deep clone så bliver felter som er objekter også clonet.
Med assignment får du bare en reference mere til samme objekt. Uden bogen form for cloning.
Men hvis klassen kun har felter som er objekter så kan forskellen synes meget lille. Det er kun med felter som er simple data typer at du rigtigt kan føle forskellen.
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.