为什么我在java中使用静态初始化块?

时间:2013-03-06 11:37:39

标签: java static

当我可以通过构造函数初始化静态成员时,为什么要使用静态初始化块?

3 个答案:

答案 0 :(得分:4)

首先,您可能永远不会有任何班级实例。或者你可能希望在之前有静态成员你有任何类的实例。

其次,从构造函数初始化静态成员是更多的工作:

  • 你需要确保每个构造函数都这样做;
  • 您需要维护一个标志来跟踪静态成员是否已初始化;
  • 你必须考虑同步以防止竞争条件;
  • 您可能必须考虑同步的性能影响,特别是如果您有许多线程创建了类的许多实例。

最后,概念通常是错误的(我说“通常”因为懒惰初始化有合法用途)。

答案 1 :(得分:1)

静态成员未与该类的任何实例相关联,而构造函数则创建实例。您可以在没有类的单个实例的情况下使用静态成员,但仍然必须初始化它们。在这种情况下,构造函数无法完成工作。

答案 2 :(得分:0)

为什么:

static Set<String> digits = new HashSet<String>();
static {
    Collections.add(digits, "unu", "du", "tri", "kvar", "kvin");
    digits.add("ses");
    digits.add("sep");
    digits.add("ok");
}

如果可能的话:

static Set<String> digits = new HashSet<String>() {{
    Collections.add(this, "unu", "du", "tri", "kvar", "kvin");
    add("ses");
    add("sep");
    add("ok");
}};
  1. 它引入了一个新的匿名类,jar中的文件;不太理想。
  2. 第二种形式是一种令人讨厌的游戏。