Здравствуйте, Oval, Вы писали:
O>Здравствуйте, dshe, Вы писали:
O>Вот сласс
O>
O>class Outer
O>{
O>Inner inner;
O> Outer()
O> {
O> inner = new Inner();
O> }
O>class Inner
O>{
O>}
O>}
O>
O>Он содержит объект внутренего класса и все о нем знает.(Может его создать присвоить изменить)
O>>>>Как сделать чтобы они ссылались на вновь созданный объект внешнего класса?
D>>Экземпляр внутреннего класса не может поменять ссылку на свой внешний экземпляр. Полагаю, что в данном случае, наверное, придется отказаться от отношения между классами "inner-outer", а реализовать эту связь руками (с дополнительной возможностью поменять экземпляр внешнего класса)
O>Вот этого то и не хотелось, но раз никак...
Можно еще попробовать использовать serialization для создания глубокой копии Outer'а. Что-то типа такого:
/*
* Created on 13.04.2004
*
*/
package test;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
/**
* @author dshe
*
*/
public class Outer implements Cloneable, Serializable {
private final Inner inner;
public Outer() {
inner = new Inner();
}
public Object clone() {
return byteArrayToObject(objectToByteArray(this));
}
public class Inner implements Serializable {
public Outer getOuter() {
return Outer.this;
}
}
public Inner getInner() {
return inner;
}
public static void main(String[] args) {
Outer o = new Outer();
Outer p = (Outer) o.clone();
System.out.println(o != p);
System.out.println(o.getInner() != p.getInner());
System.out.println(o.getInner().getOuter() != p.getInner().getOuter());
System.out.println(o == o.getInner().getOuter());
System.out.println(p == p.getInner().getOuter());
}
// -------
private static byte[] objectToByteArray(Object object) {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ObjectOutputStream oos = null;
try {
oos = new ObjectOutputStream(bos);
oos.writeObject(object);
}
catch(IOException exc) {
throw new RuntimeException(exc.toString());
}
finally {
closeSilently(oos);
closeSilently(bos);
}
return bos.toByteArray();
}
private static Object byteArrayToObject(byte[] array) {
ByteArrayInputStream bis = new ByteArrayInputStream(array);
ObjectInputStream ois = null;
try {
ois = new ObjectInputStream(bis);
return ois.readObject();
}
catch(IOException exc) {
throw new RuntimeException(exc.toString());
}
catch(ClassNotFoundException exc) {
throw new RuntimeException(exc.toString());
}
finally {
closeSilently(ois);
closeSilently(bis);
}
}
private static void closeSilently(OutputStream os) {
try {
if(os != null) os.close();
}
catch(IOException exc) {
// just ignore
}
}
private static void closeSilently(InputStream is) {
try {
if(is != null) is.close();
}
catch(IOException exc) {
// just ignore
}
}
}