java - 为什么我们需要初始化 block 的例子

标签 java initialization block

我正在讨论这些主题:

  1. > In what order do static initializer blocks in Java run?
  2. > Java Static Initialization Order

而且我不明白如果我们有一个构造函数,我们可以在其中放置一些逻辑,例如处理异常情况,为什么我们需要初始化 block ,我们还可以将哪些代码移至构造函数?

如果答案是在某些情况下我们需要在构造函数运行之前初始化一些资源,你能帮我举一些例子吗,这样我就可以完整地看到图片了。

最佳答案

您使用(我已经使用过)静态初始化 block 的一个例子是初始化元素集合。例如,如果我有一组存储在静态映射中的解析器:

 private static Map<String, Parser> parsers = new HashMap<String, Parser>();

我可以使用静态初始化 block 来填充此映射的成员:

static {
  parsers.put("node", new NodeParser());
  parsers.put("tree", new TreeParser());
  parsers.put("leaf", new LeafParser());
  //etc.
}

我会这样做是因为我希望 map 是静态的而不是特定对象的一部分,或者如果我只希望有其中一张 map (也许我只需要一张)。

这和构造函数之间的区别是构造函数在对象实例化时调用,而静态初始化 block 将在类加载时调用。

也就是说,如果你调用

MyClass.parsers.get("node");

MyClass 构造函数永远不会被调用,因此如果您等到构造函数初始化 parsers 映射,上述调用将返回 null。

关于java - 为什么我们需要初始化 block 的例子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23898973/

相关文章:

java - 我如何更改我的 Eclipse 源格式化程序设置来处理以下示例?

java - 通过调用 Activity 在服务中显示 AlertDialog

java - 无法在 Android 上运行 MQTT 示例项目

swift - 失败的初始化器和存储的属性

c - 为什么 main 中未初始化的局部变量在 c 中为零(不是垃圾)?

ios - 阻止未从方法调用

ios - 如何取消 UIView 的旋转 block 动画

java - Firebase Valueeventlistener 花费了很多时间

c++ - 非 POD 类类型的聚合初始化?

objective-c - 为什么这个基本的 Objective C block 代码不起作用?