使用初始化块有什么好处?

Bhu*_*han 3 java initialization

我知道初始化块在首次加载类(静态初始化块)或创建实例(实例初始化块)时运行.

class SmallInit {
   static int x;
   int y;
   static { x = 7 ; } // static init block
   { y = 8; } // instance init block
}
Run Code Online (Sandbox Code Playgroud)

但是,当我们这样做的时候,这有什么特别的好处:

class SmallInit {
   static int x = 7;
   int y = 8;
}
Run Code Online (Sandbox Code Playgroud)

Way*_*ett 7

实例初始化块的一个好处是它们使Double Brace Initialization模式成为可能.

而不是这个:

Set<String> names = new HashSet<String>();
names.add("Peter");
names.add("Paul");
names.add("Mary");
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

Set<String> names = new HashSet<String>() {{
    add("Peter");
    add("Paul");
    add("Mary");
}};
Run Code Online (Sandbox Code Playgroud)

第一个括号创建一个匿名内部类; 第二个启动实例初始化程序块.(请注意,这意味着names是匿名子类的一个实例HashSet,但这通常不是问题.这也意味着此模式仅适用于非最终类.)

这在一次性情况下特别有用,在这种情况下将对象初始化为表达式会很方便.例如:

doSomethingToSet(new HashSet<String>() {{
    add("Peter");
    add("Paul");
    add("Mary");
}});
Run Code Online (Sandbox Code Playgroud)