Avatar billede dresen Nybegynder
12. september 2005 - 20:20 Der er 5 kommentarer og
1 løsning

Problemer med clone

Hej eksperter

Jeg forsøger at implementere clone(), men synes ikke udfaldet stemmer overens med mine forventninger.

Jeg vil mene at jeg her arbejder med en shallow clone(), hvorfor felterne i de to objekter (dvs. hhv. originalen og klonen) bør refere til de samme ikke primitive datatyper.

Hvis dette er sandt, hvorfor ændrer feltet name sig så ikke for begge objekter efter kaldet: changeName("Peter"); ?

I nogle noter jeg har fået udleveret i forbindelse med min undervisning fremgår følgende: clone.equals(original) is true

Er dette sandt? Kan ikke få det til at virke med mit eks.

Hvad gør jeg forkert?

/*
* Created on 2005-09-12
*
* TODO To change the template for this generated file go to
* Window - Preferences - Java - Code Style - Code Templates
*/
package Testing;

/**
* @author dresN
*
* TODO To change the template for this generated type comment go to
* Window - Preferences - Java - Code Style - Code Templates
*/
public class TestCloning implements Cloneable{

    private String name;
    private int number;
   
   
    public TestCloning(String name, int number) {

        this.name = name;
        this.number = number;
    }

    public void changeName(String name){
       
        this.name = name;
               
    }

    public void changeNumber(int number){
       
        this.number = number;
               
    }
   
    public String toString(){
       
        return name + " " + number;
    }

    public Object cloning(){
       
        Object o = null;
        try {
          o = super.clone();
        } catch(CloneNotSupportedException e) {
          System.err.println("MyObject can't clone");
        }
        return o;
               
    }
               
    public static void main(String[] args)throws Exception {
   
        TestCloning t1 = new TestCloning("hans", 21);
   
        TestCloning t2 = (TestCloning)t1.clone();
       
        // hvorfor returnerer dette ikke true, det bør det gøre iflg. slides fra
        // 2. lecture
        System.out.println(t2.equals(t1));
       
        System.out.println(t1);
        System.out.println(t2);

        t2.changeNumber(56);
        t2.changeName("peter");
       
        System.out.println("---------------------");
       
        System.out.println(t1);
        System.out.println(t2);
       
        System.out.println(t1.equals(t2));
           
    }
}
Avatar billede arne_v Ekspert
12. september 2005 - 20:40 #1
fordi du java teknisk ikke ændrer på name men derimod sætter referencen i den
ene kopi til at pege på em ny String
Avatar billede arne_v Ekspert
12. september 2005 - 20:41 #2
prøv og lad name være en StringBuffer og lav en append til navnet i den ene kopi
Avatar billede arne_v Ekspert
12. september 2005 - 20:43 #3
da du ikke har overridet equals metoden som du burde så kan du ikke forvente at de er ens
Avatar billede dresen Nybegynder
13. september 2005 - 17:23 #4
Hej arne

Tak for dit svar.

Jeg burde selv have set, at jeg ændrede referencen til at pege på en ny streng.

Havde misforstået noterne fra min underviser - jeg har nu forstået, at når jeg implementerer clone, skal jeg sørge for at klassen har bestemte egenskaber, bl.a. at equals lever op til ovenstående.

Læg et svar, så du kan få dine point.

mvh/ dresen
Avatar billede arne_v Ekspert
13. september 2005 - 18:24 #5
svar
Avatar billede dresen Nybegynder
17. september 2005 - 20:25 #6
point :D

Jeg ved du kan din Eclipse, så kender du svaret på følgende?

http://www.eksperten.dk/spm/647044
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