被忽视的初始化块

前言

从学过初始化块之后, 就一直没用到, 今天学习Mybatis, 居然有一处语法没看懂。特此记录一下。

1
2
3
4
5
6
7
8
9
public class PrivilegeProvider {
public String selectById(final Long id){
return new SQL(){
{
SELECT("id, privilege_name, privilege_url");
}
}.toString();
}
}

初始化块

这可不是Lambda表达式, 因为环境是JDK 1.7
而是初始化块
我们自己创建个例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class MyList<E> {
private ArrayList<E> list = new ArrayList<>();
// 链式编程, 返回this
public MyList<E> add(E e) {
list.add(e);
return this;
}
}

public class MyTest {
@Test
public void test1() {
MyList<String> list = new MyList<String>() {
// 初始化块
{
add("test1");
add("test2");
for (int i = 3; i < 5; i++) {
add("test3");
}
}
};
Assert.assertEquals(4, list.list.size());
}

@Test
public void test2() {
MyList<String> list = new MyList<String>()
.add("test1")
.add("test2");
for (int i = 3; i < 5; i++) {
list.add("test3");
}
Assert.assertEquals(4, list.list.size());
}
}

test1方法, 是不是和上面的很熟悉, 其实就是使用了初始化块, 进行初始化。和下面test2方法是等价的。

而且也不会产生匿名内部类, 对于某些需要参数进行初始化, 而不得不将其设计为抽象类的类, 是一种很好的代码优化手段。