这段代码几乎是我想要做的:

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字段在这种特殊情况下适用,因为该类的所有实例都可以共享它,而没有任何副作用,但是,如果您想拥有一些不是线程安全的初始化器,这可能会成为问题。甚至没有谈论静态字段不符合垃圾回收的条件。永远

10-05 19:13