Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Не работает глубокое клонирование


Автор: 4epT 14.5.2009, 14:10
Добрый день!

Нужно сделать клон объекта класса, класс содержит 2 коллекции, каждый элемент коллекций сам является объектом.

Вот структуры классов и мой метод клонирования (который не работает):

Код

public class Box
{
    private Vector<Vector3D> vertexes = new Vector<Vector3D>();
    private Vector<NPair> lines = new Vector<NPair>();

    public Box(Vector3D A,Vector3D B,Vector3D C,Vector3D D,Vector3D E,Vector3D F,Vector3D G,Vector3D H)
    {
        this.vertexes.add(A);
        this.vertexes.add(B);
        this.vertexes.add(C);
        this.vertexes.add(D);
        this.vertexes.add(E);
        this.vertexes.add(F);
        this.vertexes.add(G);
        this.vertexes.add(H);
        lines.add(new NPair(0,1));//A->B
        lines.add(new NPair(1,2));//B->C
        lines.add(new NPair(2,3));//C->D
        lines.add(new NPair(3,0));//D->A
        lines.add(new NPair(4,5));//E->F
        lines.add(new NPair(5,6));//F->G
        lines.add(new NPair(6,7));//G->H
        lines.add(new NPair(7,4));//H->E
        lines.add(new NPair(0,4));//A->E
        lines.add(new NPair(1,5));//B->F
        lines.add(new NPair(2,6));//C->G
        lines.add(new NPair(3,7));//D->H
    }

    @Override
    public Object clone() throws CloneNotSupportedException
    {
        return new  Box(this.vertexes.get(0),this.vertexes.get(1),this.vertexes.get(2),this.vertexes.get(3),this.vertexes.get(4),this.vertexes.get(5),this.vertexes.get(6),this.vertexes.get(7));
    }
}


Код

public class Vector3D
{
    private double _x,_y,_z,_w;
    public Vector3D(double x, double y, double z)
    {
        _x = x;
        _y = y;
        _z = z;
    }

    public Vector3D(double x, double y, double z, double w)
    {
        _x = x;
        _y = y;
        _z = z;
        _w = w;
    }
}


Код

public class NPair
{
    public int n1,n2;

    public NPair(int n1, int n2)
    {
        this.n1 = n1;
        this.n2 = n2;
    }
}


Подскажите пожалуйста как правильно переопределить метод clone ?

Автор: aleksandy 15.5.2009, 08:41
Помимо создания метода clone() у класса Box, нужно создать этот метод и у класса Vector3D.
А сам метод класса Box переписать вот так:
Код

  @Override
  public Object clone() throws CloneNotSupportedException {
    return new Box(
      this.vertexes.get(0).clone(),
      this.vertexes.get(1).clone(),
      this.vertexes.get(2).clone(),
      this.vertexes.get(3).clone(),
      this.vertexes.get(4).clone(),
      this.vertexes.get(5).clone(),
      this.vertexes.get(6).clone(),
      this.vertexes.get(7).clone()
    );
  }

Автор: Connie 15.5.2009, 08:45
4epT, 
а) нужен конструктор копирования, по такому типу
Код

public Box(Box source){

for(Vector3D item source.vertexes){
vertexes.add(item);
}
for(NPair item source.lines){
lines.add(item);
}

}


При этом код clone будет выглядеть так
Код

@Override
    public Object clone() throws CloneNotSupportedException
    {
        return new  Box(this);
    }

Но лучше его не использовать, а использовать там где нужно именно конструктор копирования.

P.S. Это вроде основы ООП 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)