复合inheritance:如何在子类构造函数中分配一个最终字段,该字段取决于’this’值(向后引用)?

我使用复合类来分组function。
但是,A类(具有复合A1)由B(具有复合B1)inheritance,并且A1处存在的行为将在B1处被调整,但是最终a1必须是B1实例才能使其工作。

Obs。:我有办法确保复合实例化正确发生(仅由其复合伙伴)。

无法将B1对象分配给a1 final字段:

class finalFieldTestFails{ class A1{ A1(A a){} } class A{ protected final A1 a1; A(){ this.a1 = new A1(this); } A(A1 a1){ this.a1 = a1; } } class B1 extends A1{ B1(B b){ super(b); } } class B extends A{ //B(){ super.a1=new B1(this); } //FAIL: cant change final value //B(){super(new B1(this));} //FAIL: cant use 'this' or 'super' } } 

PS:如果可能的话,答案不应涉及reflection安全技巧。

B(){super.a1 = new B1(this); } //失败:无法更改最终值

您不能为已分配的最终变量赋值,您可以在构造函数中实例化它,但不能如下所示。

B(){super(new B1(this));} // FAIL:不能使用’this’或’super’

只有创建实例后才能使用此选项。 由于有一个inheritance树,它没有完全实例化,所以编译器抱怨,

在调用超类型构造函数之前无法引用它

有了这个提示 ,由@KevinHooke提供,我找到了这个答案 ,我在下面提供了这个代码。

但请注意,我选择的这个选项可能会带来麻烦 。

所以我最终使用重写方法来实例化“1”类,让超类负责分配。

 class finalFieldTestWorks{ class A1{A1(A a){}} class A{ protected final A1 a1; A(){ this.a1=new1(); } protected A1 new1(){return new A1(this);} } class B1 extends A1{B1(B b){super(b);}} class B extends A{ B(){ super(); } @Override protected B1 new1(){return new B1(this);} } } 

PS。:其他提示/解决方法将不胜感激。