6

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

4

3 回答 3

5

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

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

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

最后,从概念上讲,这通常是错误的(我说“通常”是因为延迟初始化有合法用途)。

于 2013-03-06T11:44:23.143 回答
1

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

于 2013-03-06T11:44:29.897 回答
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. 第二种形式是一个令人讨厌的游戏。
于 2013-03-06T11:46:37.320 回答