Глубокое копирование в Java с помощью клонирования - PullRequest
0 голосов
/ 21 ноября 2018

В настоящее время у меня есть два класса, Вселенная и Мир.Класс Universe имеет поле ArrayList, в котором перечислены все миры этой вселенной.Я хочу иметь возможность скопировать вселенную, а затем добавить в нее мир, чтобы у меня было два объекта вселенной, один из которых на один мир меньше другого.

Это класс Universe:

public class Universe {
    private ArrayList<World> worlds;
    private int worldCount;
    private boolean reflex;
    private boolean trans;
    private boolean symm;
    private boolean hereditary;

    public Universe(ArrayList<World> worlds, int worldCount, boolean reflex, boolean trans, boolean symm, boolean hereditary) {
        this.worlds = worlds;
        this.worldCount = worldCount;
        this.trans = trans;
        this.reflex = reflex;
        this.symm = symm;
        this.hereditary = hereditary;
        if (this.symm && this.trans) { // symmetry and transitivty makes reflexivity
            this.reflex = true;
        }
    }
    public Universe(Universe u) { // creates a shallow copy of the other universe
        this(u.getWorlds(), u.getWorldCount(), u.getReflex(), u.getTrans(), u.getSymm(), u.getHereditary());
    }
    @Override
    public Object clone() {
        Universe u = null;
        try {
            u = (Universe) super.clone(); 
        }catch(CloneNotSupportedException e) { 
            u = new Universe(this.getWorlds(), this.getWorldCount(), this.getReflex(), this.getTrans(), this.getSymm(), this.getHereditary());
        } 
        return u;
    }
}

И класс World:

public class World {
    private Universe parentUniverse;
    private String worldName;
    private ArrayList<Relation> relations; 
    private ArrayList<ExprStr> expressions;


    public World(Universe u) {
        this.parentUniverse = u;                 
        int count = u.getWorldCount();
        String countStr = Integer.toString(count);
        this.worldName = "";
        this.worldName += 'w' + countStr;
        this.relations = new ArrayList<Relation>();
        if (this.parentUniverse.getReflex()) {
            this.addRelation(this, true, true); 
        }
        this.expressions = new ArrayList<ExprStr>();
    }
}

Класс World называет себя в своей собственной вселенной, и метод toString возвращаетэто имяМетод toString для Universe возвращает список всех миров.

У меня есть код:

Universe y = new Universe();
World d = new World(y);
y.addWorld(d);

Universe x = (Universe) y.clone(); // have to type cast to use clone()
World d1 = new World(x);
x.addWorld(d1);

System.out.println(y);
System.out.println(x);

Но вывод:

[w0, w1]
[w0, w1]

Даже если, еслиГлубоко скопировано правильно, я ожидал, что в одной вселенной будет больше миров, чем в другом.

Нужно ли мне также копировать класс World?Что я делаю неправильно?

Спасибо, куча!:)

...