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)
实例初始化块的一个好处是它们使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)