Java一个克隆的内部类有错误的外部

时间:2014-01-23 11:51:38

标签: java

我无法找到有关克隆内部类问题的解决方案(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无法实例化它们。

0 个答案:

没有答案