java 中何时使用初始化程序块?

When are initializer blocks used in java?

我读到初始化程序块是“一个未命名的代码块,其中包含初始化 class 的代码?

例如:

class A {
  final int x;
  final int y;
  final String n;

{ 
    x = 10;
    y = 20;
}

public A(String name ) {

/* etc... etc */

我从未见过使用过这种类型的代码,所以我想知道它可能对哪些地方有帮助。为什么我们不直接在构造函数中初始化变量?

谢谢

一个常见的用法是 static initializer block:

class A {
    static boolean verbose;
    final int x;
    final int y;
    final String n;

static { 
    verbose = doSomethingToGetThisValue();
}

public A(String name ) {

/* etc... etc */

这很有用,因为在创建 class 的实例之前(因此在调用构造函数之前),您的静态变量可能会被静态方法使用。

另见 this SO answer

我认为有时在定义变量时立即对其进行初始化会很有帮助。

public class Stooges {
  private ArrayList<String> stooges = new ArrayList<>();
  { stooges.add("Lary"); stooges.add("Curly"); stooges.add("Moe"); }

  // ... etc. other methods.
}

该初始值设定项现在对所有构造函数都是通用的,因此它避免了代码重复。您可以使用私有方法并从所有构造函数中调用类似的代码,但这种方式甚至可以避免记住插入方法调用。减少维护!

可能还有其他例子。如果初始化代码调用了一个抛出异常的方法,那么你就不能直接给它赋值。您必须捕获异常。