我一直在阅读Java中的实例初始化器,并且已经解释了所有构造函数通用的代码都可以放入其中,因为每次创建类的新实例时都会调用它们。是否存在一个在构造函数之后运行的实例初始值设定项,对于所有构造函数都是通用的代码,但取决于构造函数中发生的情况?
答案 0 :(得分:2)
不,没有确切的等价物。如果你想运行一些公共代码,你总是可以将一个方法分解出来并在所有构造函数的末尾调用它:
public class C {
private int x = 5;
private String y;
public C(int x) {
this.x = x;
endConstructor();
}
public C(String x) {
this.x = x.length;
endConstructor();
}
private void endConstructor() {
y = x + "!";
}
}
有时候,您希望在" end"处调用相同代码的情况。可以重构所有构造函数,以便此代码位于单个主构造函数中。然后,所有其他构造函数使用this()
调用它。对于上面的例子:
public class C {
private int x = 5;
private String y;
public C(int x) {
this.x = x;
y = x + "!";
}
public C(String x) {
this(x.length);
}
}
如果合适,主构造函数可以是私有的。
答案 1 :(得分:0)
可以使用@PostConstruct
注释之类的东西。
如果你的类使用setter方法注入了它的依赖项,那么它的构造函数不会完全初始化一个实例。因此,额外的"初始化"需要在调用所有setter方法后执行。
答案 2 :(得分:0)
如果您认为构造函数中发生了某些事情:
class X {
private int x;
public X() {
// Code that sets x
// =-=-= HERE =-=-=
}
}
在构造函数之后插入您想要发生的代码...在构造函数的末尾。
如果您有许多构造函数并且不想复制代码:
class X {
private int x;
public X() {
// Code that sets x
init();
}
public X(int x2) {
x = x2;
init();
}
private void init() {
// =-=-= HERE =-=-=
}
}
如果每个构造函数都调用init
,我们可能会说这是作为构造函数的一部分调用的,而不是在它之后。想象一下火车后面还有一辆车,离它50厘米。两者都有相同的目的地/时间。为什么我们不能将火车与独立车连接?