不要求在"单个逻辑行"中对static final
变量进行初始化.
你可以简单地写
private static final List<String> a = new ArrayList<>();
static {
a.addAll(b);
a.addAll(c);
a.add(d);
a.add(e);
}
它被称为静态初始化器块.
请注意,由于该列表在整个运行时期间将保持可变,因此您可以在任何时间、任何地点向该列表添加内容.
因为您可能不需要这样,而是使用类初始化了一个真正不变的列表,所以您甚至可以编写
private static final List<String> a;
static {
List<String> tmp = new ArrayList<>();
tmp.addAll(b);
tmp.addAll(c);
tmp.add(d);
tmp.add(e);
a = List.copyOf(tmp);
}
换句话说,将初始值设定项块末尾的字段与最终结果一起赋值.
List.copyOf(…)
(从Java 9开始)创建了一个不可变的副本,但不允许null
个元素,一般来说,null
的值是very strict behavior.
如果您需要一个支持空的不可修改的列表,您可以使用tmp.stream().toList()
(从Java版本16开始).
但是,即使对于那些不了解静态初始化器的人来说,对于复杂的字段初始化器,也有一个非常简单的解决方案:
private static final List<String> a = createA();
private static List<String> createA() {
List<String> tmp = new ArrayList<>();
tmp.addAll(b);
tmp.addAll(c);
tmp.add(d);
tmp.add(e);
return List.copyOf(tmp);
}