Java构造函数

时间:2016-05-09 20:22:29

标签: java

我一直在阅读Java中的实例初始化器,并且已经解释了所有构造函数通用的代码都可以放入其中,因为每次创建类的新实例时都会调用它们。是否存在一个在构造函数之后运行的实例初始值设定项,对于所有构造函数都是通用的代码,但取决于构造函数中发生的情况?

3 个答案:

答案 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厘米。两者都有相同的目的地/时间。为什么我们不能将火车与独立车连接?