【问题标题】:Static block is never run静态块永远不会运行
【发布时间】:2013-03-27 01:05:29
【问题描述】:

我有一个如下所示的实用程序类:

public final class MyUtils {

     public static final List<String> MY_VALUES = new ArrayList<String>();

     {
         MY_VALUES.add("foo");
         MY_VALUES.add("bar");
     }
}

我从另一个班级这样称呼它:

MyUtils.MY_VALUES

如果我这样做,列表是空的,如果我调试我会看到静态块永远不会运行。

我从When does static class initialization happen? 和How to force a class to be initialised? 的答案中了解到,该块应该在a static field of the class is assigned 时运行,我马上就这样做了。我还尝试将变量设置为非最终变量以满足条件“a non-constant static field is used”。

我可以使用其他两个问题和Why doesn't my static block of code execute? 中也建议的 init 方法,但我仍然想了解为什么它一开始就不起作用,尽管我似乎已经满足了语言规范。

【问题讨论】:

    标签: java static


    【解决方案1】:

    您必须在块前面添加 static 关键字才能使其成为静态:

    public final class MyUtils {
    
         public static final List<String> MY_VALUES = new ArrayList<String>();
    
         static {
             MY_VALUES.add("foo");
             MY_VALUES.add("bar");
         }
    }
    

    每次构造类时都会调用一个初始化块。

    静态初始化块只在程序开始时被调用一次。

    【讨论】:

    • 这行得通,谢谢。需要几分钟,我才能接受你的回答。你能解释一下没有static 关键字的构造有什么区别吗?我以前用过它,到目前为止它一直有效(例如,如果我调用静态方法,则该块之前运行过)。
    • 不完全正确。每次构造类的 object 时都会调用初始化块。第一次使用类时(或多或少)调用静态初始化块。
    猜你喜欢
    • 1970-01-01
    • 2021-08-05
    • 1970-01-01
    • 2015-05-31
    • 2019-10-10
    • 1970-01-01
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多