这段代码几乎就是我想做的事情:
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())
但这感觉非常不合适。这样做的正确方法是什么?
答案 0 :(得分:2)
我会在任何构造函数之外创建Random
对象作为static final
变量,以便您可以在no-arg构造函数的第一行引用它。
private static final Random r = new Random();
public TestClass() {
this(r.nextInt(),r.nextInt());
}
这样,您只需要一个Random
对象,并在构造函数的第一行之前初始化它。
答案 1 :(得分:1)
您可以使用将复杂的初始化逻辑移动到单独的方法:
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
字段适用于这种特殊情况,因为类的所有实例都可以共享它而没有任何副作用,但是如果你想要一些不是线程安全的东西作为初始化器,这可能会成为一个问题。甚至没有谈论静态字段没有资格进行垃圾收集。 EVER
答案 2 :(得分:1)
除Random对象外,您没有定义startTestVarA和startTestVarB。
答案 3 :(得分:0)
也许是这样的?
import java.util.Random;
public class TestClass {
protected int testVarA;
protected int testVarB;
private static Random r = new Random();
public TestClass() {
this(r.nextInt(),r.nextInt());
}
public TestClass(int testVarA, int testVarB) {
this.testVarA = testVarA;
this.testVarB = testVarB;
}
}