保持对传递给超级构造函数的新对象的引用

Mar*_* A. 8 java constructor field super

是否有维持在需要传递一些扩展类(比使它从超类访问,或将其传递到构造函数中的参数等)的超级构造函数构造函数创建的对象的引用的好办法?

让我用一个例子来澄清.拿这个类(我无法修改,哪些不能让我访问foo):

class TestA {
    TestA(Object foo) {}
}
Run Code Online (Sandbox Code Playgroud)

现在,我想扩展这个类如下:

class TestB extends TestA {
    Object myCopyOfFoo;

    TestB() {
        super(new Object());
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有一种很好的方法来存储创建new Object()myCopyOfFoo

这三个想法中的任何一个都不起作用:

TestB() {
    myCopyOfFoo = new Object();
    super(myCopyOfFoo);
}
Run Code Online (Sandbox Code Playgroud)

(错误:构造函数调用必须是构造函数中的第一个语句)

TestB() {
    super(myCopyOfFoo = new Object());
}
Run Code Online (Sandbox Code Playgroud)

(错误:显式调用构造函数时无法引用实例字段myCopyOfFoo)

TestB() {
    super(makeFoo());
}

Object makeFoo() {
    myCopyOfFoo = new Object();
    return myCopyOfFoo;
}
Run Code Online (Sandbox Code Playgroud)

(错误:显式调用构造函数时无法引用实例方法)

我想我可以做到以下几点,但它既不是线程安全也不优雅:

static Object tempFoo;

TestB() {
    super(tempFoo = new Object());
    myCopyOfFoo = tempFoo;
}
Run Code Online (Sandbox Code Playgroud)

有没有人对我有更好的想法?为什么我的前两个想法不合法呢?

Jon*_*eet 17

怎么样:

class TestB extends TestA {
    Object myCopyOfFoo;

    // I assume you actually wanted this to take a parameter called foo?
    // I've left it as per the question...
    TestB() {
        this(new Object());
    }

    private TestB(Object copy) {
        super(copy);
        myCopyOfFoo = copy;
    }
}
Run Code Online (Sandbox Code Playgroud)

由于第二个构造函数是私有的,它只能在同一个类(或一个封闭的类)中调用,所以你只需要确保调用第二个构造函数的任何东西都做了一个适当的副本,就像第一个构造函数那样.

编辑:如果您的真实情况是您正在获取现有参数的副本,那么这将有效......

class ClassB extends ClassA {
    private final Foo copyOfInput;

    ClassB(Foo input) {
        super(input = input.clone());
        copyOfInput = input;
    }
}
Run Code Online (Sandbox Code Playgroud)

虽然很丑陋:(