我无法找到有关克隆内部类问题的解决方案(http://bugs.sun.com/view_bug.do?bug_id=4206170)。克隆的内部类具有错误的外部实例。
类:
public class Outer implements Cloneable {
public Inner inner = new Inner();
@Override
public Outer clone() {
try {
Outer clone = (Outer) super.clone();
clone.inner = inner.clone();
return clone;
} catch (CloneNotSupportedException e) {
throw new Error( "CloneNotSupported: " + e.getMessage());
}
}
public class Inner implements Cloneable {
@Override
public Inner clone() {
try {
Inner clone = (Inner) super.clone();
return clone;
} catch (CloneNotSupportedException e) {
throw new Error( "CloneNotSupported: " + e.getMessage());
}
}
public Outer getOuter() {
return Outer.this;
}
}
}
并测试:
import org.junit.Test;
import static org.junit.Assert.*;
public class InnerCloneTest {
@Test
public void test(){
Outer outer1 = new Outer();
Outer outer2 = outer1.clone();
assertNotSame(outer1, outer2);//OK
assertNotSame(outer1.inner, outer2.inner);//OK
assertSame(outer1.inner.getOuter(), outer1);//OK
assertSame(outer2.inner.getOuter(), outer2);//ERROR
assertNotSame(outer1.inner.getOuter(), outer2.inner.getOuter());//ERROR
}
}
我应该使用构造函数而不是克隆吗?
它似乎只是适合它的构造函数。
//clone.inner = inner.clone(); //don't work
//clone.inner = clone.inner.clone(); //don't work
clone.inner = clone.new Inner(); //OK
似乎是使用非静态内部类是反模式。它们是不可序的。 Spring IoC无法实例化它们。