我正在尝试将字符串列表初始化为私有静态final,但是我总是将l
的值设置为null,并且如果如第二段代码所示声明它,它就可以工作。
我想要做的是将我声明的列表的元素添加到特里,以便以后匹配某些模式...
关于第一个示例中为什么为空值的任何想法以及如何纠正它?谢谢
public class Myclass {
public static final Myclass INSTANCE = new Myclass();
private static final List<String> l = Arrays.asList("ofo", "oof", "foo");
private Trie trie;
private Myclass() {
trie = buildTrie();
}
private Trie buildTrie() {
TrieBuilder builder = Trie.builder();
Iterator<String> iterator = l.iterator();
while (iterator.hasNext()) {
builder.addKeyword(iterator.next());
}
return builder.build();
}
}
public class Myclass {
public static final Myclass INSTANCE = new Myclass();
private Trie trie;
private Myclass() {
List<String> l = Arrays.asList("ofo", "oof", "foo");
trie = buildTrie();
}
private Trie buildTrie() {
TrieBuilder builder = Trie.builder();
Iterator<String> iterator = l.iterator();
while (iterator.hasNext()) {
builder.addKeyword(iterator.next());
}
return builder.build();
}
}
答案 0 :(得分:5)
public class Myclass {
public static final Myclass INSTANCE = new Myclass();
private static final List<String> l = Arrays.asList("ofo", "oof", "foo");
静态初始化按照声明的顺序进行。这意味着INSTANCE
在l
之前初始化,因此Myclass
的构造函数读取l
的未初始化值。
颠倒声明的顺序:
public class Myclass {
private static final List<String> l = Arrays.asList("ofo", "oof", "foo");
public static final Myclass INSTANCE = new Myclass();
或者,如果实际上不需要l
,请考虑将其作为构造函数参数传递。