当我可以通过构造函数初始化静态成员时,为什么要使用静态初始化块?
问问题
5983 次
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");
}};
- 它引入了一个新的匿名类,jar 中的一个文件;不是那么理想。
- 第二种形式是一个令人讨厌的游戏。
于 2013-03-06T11:46:37.320 回答