请考虑以下课程:
class MyClass extends Parent {
private AnotherClass property;
public MyClass(int value) {
super(new AnotherClass(value));
this.property = new AnotherClass(value);
}
}
class AnotherClass {
/* Implementation not shown */
}
class Parent {
/* Implementation not shown, and may not be changed */
}
在不更改构造函数参数的情况下(例如:MyClass(AnotherClass value)
),我如何构造它以便new AnotherClass()
不会被调用两次?
以下是不起作用的示例:
public MyClass(int value) {
AnotherClass anotherClass = new AnotherClass(value);
super(anotherClass);
this.property = anotherClass;
}
它引发了一个错误,指出对super的调用必须是第一行。
我正在创建需要我进行双重调度的内容,而且我可能不会更改实例化MyClass
的方式。 (new MyClass(0)
)。我也许不会碰到超级班。
是否可以只调用一次AnotherClass?
答案 0 :(得分:4)
将其移动以使用两个构造函数
public MyClass(int value) {
this (new AnotherClass(value));
}
public MyClass(AnotherClass a) {
super(a);
this.property = a;
}
注意强>
@alfasin
也提出了这一点答案 1 :(得分:1)
你不能这样做,因为必须在第一行调用super()
。那说,
您可以在调用AnotherClass
之前使用依赖注入并实例化new MyClass(new AnotherClass())
。然后构造函数将如下所示:
public MyClass(AnotherClass a) {
super(a);
this.property = a;
}
如果您无法更改MyClass
,可以使用包装类将其包装并应用相同的“技巧”。
答案 2 :(得分:1)
您可以尝试这样的事情:
private static AnotherClass temp;
public MyClass(int value) {
super(temp = new AnotherClass(value));
this.property = temp;
temp = null;
}
答案 3 :(得分:0)
首先让我修复编译错误。
Class MyClass {
错了。你应该写
class MyClass {
代替。
其次,当你从类的构造函数中调用suprer(something)
时,你实际上会调用显然必须存在的超类的构造函数。否则您将收到编译错误。由于java中的所有类都隐式扩展java.lang.Object
(除非定义了其他基类)并且java.lang.Object
没有能够获得类型AnotherClass
的参数的构造函数,因此行super(new AnotherClass())
不能编译。
第三,超类的构造函数的调用必须是构造函数的第一行。否则,实例的创建可能不一致,因为子类可能使用超类的状态。
因此,以下代码将编译并运行。
class MyBaseClass {
protected MyBaseClass(AnotherClass ac) {
// some initialization code
}
}
class MyClass extends MyBaseclass {
private AnotherClass property;
public MyClass(int value) {
super(new AnotherClass(value));
this.property = new AnotherClass(value);
}
}
我希望这个答案有所帮助。