这段代码几乎是我想要做的:
import java.util.Random;
public class TestClass {
protected int testVarA;
protected int testVarB;
public TestClass() {
Random r = new Random();
this(r.nextInt(),r.nextInt());
}
public TestClass(int testVarA, int testVarB) {
this.testVarA = startTestVarA;
this.testVarB = startTestVarB;
}
}
但是,这不能编译,因为
this()
语句必须在函数的开头。我可以做类似的事情this((new Random()).getNextInt(),(new Random()).getNextInt())
但这感觉非常不当。这样做的正确方法是什么?
最佳答案
您可以使用将复杂的初始化逻辑移动到单独的方法:
public TestClass() {
Random r = new Random();
init(r.nextInt(),r.nextInt());
}
public TestClass(int testVarA, int testVarB) {
init(testVarA, testVarB)
}
private void init(int testVarA, int testVarB) {
this.testVarA = startTestVarA;
this.testVarB = startTestVarB;
}
这不仅仅是将
Random
作为字段,而是更通用的解决方案。 Random
字段在这种特殊情况下适用,因为该类的所有实例都可以共享它,而没有任何副作用,但是,如果您想拥有一些不是线程安全的初始化器,这可能会成为问题。甚至没有谈论静态字段不符合垃圾回收的条件。永远