字符串列表始终为null

时间:2019-04-18 08:21:31

标签: java

我正在尝试将字符串列表初始化为私有静态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();
    }
}

1 个答案:

答案 0 :(得分:5)

public class Myclass {
    public static final Myclass INSTANCE = new Myclass();

    private static final List<String> l = Arrays.asList("ofo", "oof", "foo");

静态初始化按照声明的顺序进行。这意味着INSTANCEl之前初始化,因此Myclass的构造函数读取l的未初始化值。

颠倒声明的顺序:

public class Myclass {
    private static final List<String> l = Arrays.asList("ofo", "oof", "foo");

    public static final Myclass INSTANCE = new Myclass();

或者,如果实际上不需要l,请考虑将其作为构造函数参数传递。