首先,在那里将 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;
}
}
和:
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();
...
}
}
有很多方法可以做这些事情,使用最合适的方式并提供最清晰和最易于维护的代码。