Java自定义构造函数的可选值

时间:2014-07-31 23:22:04

标签: java constructor

这段代码几乎就是我想做的事情:

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())

但这感觉非常不合适。这样做的正确方法是什么?

4 个答案:

答案 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;
  }
}