首先,在那里将 test 初始化为 new String() 是没有意义的,因为初始化块立即将其分配给其他内容。无论如何...
一种替代方法是在声明处初始化:
public class BlockTest {
String test = "testString";
}
另一个是在构造函数中:
public class BlockTest {
String test;
public BlockTest () {
test = "testString";
}
}
这是两个主要的常见选项。
初始化块有两个主要用途。第一个是对于在初始化期间必须执行一些逻辑的匿名类:
new BaseClass () {
List<String> strings = new ArrayList<String>();
{
strings.add("first");
strings.add("second");
}
}
第二个是公共初始化,必须在每个构造函数之前发生:
public class MediocreExample {
List<String> strings = new ArrayList<String>();
{
strings.add("first");
strings.add("second");
}
public MediocreExample () {
...
}
public MediocreExample (int parameter) {
...
}
}
但是,在这两种情况下,都有不使用初始化块的替代方案:
new BaseClass () {
List<String> strings = createInitialList();
private List<String> createInitialList () {
List<String> a = new ArrayList<String>();
a.add("first");
a.add("second");
return a;
}
}
And:
public class MediocreExample {
List<String> strings;
private void initialize () {
strings = new List<String>();
strings.add("first");
strings.add("second");
}
public MediocreExample () {
initialize();
...
}
public MediocreExample (int parameter) {
initialize();
...
}
}
做这些事情的方法有很多种,使用最合适的方式并提供最清晰和最容易维护的代码。