Avatar billede ng-km Nybegynder
20. juli 2003 - 14:42 Der er 3 kommentarer og
1 løsning

Clone af en Vector med objekter

Jeg har en klasse, med nogle primitive datatyper, som jeg gerne vil kunne klone(lave en kopi).


public class Testklasse
{
    private int nummer;
    private boolean maaAendres;
    private String navn;
    private double hastighed;
   
    public Testklasse()
    {
        nummer = 1;
        maaAendres = true;
        navn = "Gudrun";
        hastighed = 1.23;
    }
   
    //her er set- og getmetoder


    public Object clone()
    {
        try
        {
            Testklasse kopi = Testklasse super.clone();
            return kopi;
        }
        catch (CloneNotSupportedException e)
        {
            return "Ups!!"
        }
    }
}


public class Andenklasse
{
    Vector testklasseVector;

    //her fyldes vectoren

    //her vil jeg så gerne have en kopi af testklasseVector

    Vector kopi = testklasseVector.clone();
}

Jeg har forsøgt at lave en kloningsmetode, men kan ikke helt få det til at spille.

Hvis jeg har en Vector, med objekter af Testklasse, som jeg gerne vil have klonet, hvordan griber jeg det så an?

Med den viste metode, får jeg to Vectorer med de samme objektadresser, og Testklasse-objekterne er dermed ikke klonet, det kan jeg konstatere.
Avatar billede arne_v Ekspert
20. juli 2003 - 14:48 #1
Det er sådan Vector clone virker.

Du bliver nødt til at lave en ny Vector og add'e en clone af hvert element.

Eventuelt kan du lave en wrapper klasse til Vector der indeholder en clone
der gør det.
Avatar billede arne_v Ekspert
20. juli 2003 - 15:04 #2
Eksempel:

public class Data {
    private int iv;
    private String sv;

    public Data() {
        iv = 0;
        sv = "";
    }
   
    public Data(int iv, String sv) {
        this.iv = iv;
        this.sv = sv;   
    }
   
    public void setIv(int iv) {
        this.iv = iv;
    }

    public int getIv() {
        return iv;
    }

    public void setSv(String sv) {
        this.sv = sv;
    }

    public String getSv() {
        return sv;
    }
   
    public Object clone() {
        Data res = new Data();
        res.iv = iv;
        res.sv = new String(sv);
        return res;
    }
}

import java.util.Vector;

public class Container {
    private Vector v;
   
    public Container() {
        v = new Vector();
    }
   
    public void add(Data e) {
        v.add(e);
    }
   
    public Data get(int ix) {
        return (Data)v.get(ix);
    }
   
    public int size() {
        return v.size();
    }
   
    public Object clone() {
        Container res = new Container();
        for(int i = 0; i < size(); i++) {
            res.add((Data)get(i).clone());
        }
        return res;
    }
}

public class Test {
    public static void main(String[] args) {
        Container c1 = new Container();
        c1.add(new Data(1, "a"));
        c1.add(new Data(2, "bb"));
        c1.add(new Data(3, "ccc"));
        Container c2 = (Container)c1.clone();
        System.out.println(c1.get(2) + " " + c2.get(2));
        System.out.println(c1.get(2).getSv() + " " + c2.get(2).getSv());
    }
}
Avatar billede ng-km Nybegynder
20. juli 2003 - 21:32 #3
OK hvis jeg selv kloner hvert objekt så virker det, men jeg troede at der automatisk blev klonet nedad i objekthierakiet hvis man klonede en Vector, og der var en clone-metode i hvert objekt. Hvad er der så smart med clone() hvis det ikke virker sådan, så kan man jo bare lave en metode der hedder kopi()???

Men det virker nu, så tak for hjælpen.
Avatar billede arne_v Ekspert
20. juli 2003 - 21:39 #4
Vector clone er en shallow clone ikke en deep clone.

Desværre er dokumentationen ikke særligt klar:

public Object clone()

    Returns a clone of this vector. The copy will contain a reference to a clone of the internal data array, not a reference to the original internal data array of this Vector object.

Den er noget bedre for ArrayList:

public Object clone()

    Returns a shallow copy of this ArrayList instance. (The elements themselves are not copied.)
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