Здравствуйте, _zer0, Вы писали:
_>Здравствуйте, Oval, Вы писали:
O>>При клонировании объекта внешнего класса, если он содержит объекты внутренних классов эти объекты при клонировании ссылаются на старого предка внешнего класса.
Не совсем понятна фраза "он содержит объекты внутренних классов ". Экземпляр внешнего класса ничего не знает о своих внутренних экземплярах (если, конечно, их не региситрировать явно руками). Тут связь однонаправленная -- от внутреннего к внешнему.
O>>Как сделать чтобы они ссылались на вновь созданный объект внешнего класса?
_>у внешнего класса перекрываешь clone()
_>а внутри клонируешь внутренний и переприсваеваешь необходимые ссылки руками, что-то типа
_>_>public Object clone() throws CloneNotSupportedException {
_> Parent result = (Parent) super.clone();
_> Child child = result.child.clone();
_> child.parent = result;
_> return result;
_>}
_>
Экземпляр внутреннего класса не может поменять ссылку на свой внешний экземпляр. Полагаю, что в данном случае, наверное, придется отказаться от отношения между классами "inner-outer", а реализовать эту связь руками (с дополнительной возможностью поменять экземпляр внешнего класса)
Т.е. вместо
public class Outer {
public class Inner {
public Outer getOuter() {
return Outer.this;
}
}
}
сделать
public class PseudoOuter {
public static class PseudoInner {
private PseudoOuter outer;
public PseudoInner(PseudoOuter outer) {
this.outer = outer;
}
public PseudoOuter getOuter() {
return outer;
}
public void setOuter(PseudoOuter outer) {
this.outer = value;
}
}
}