Java 我们为什么需要初始化块的示例

Java 我们为什么需要初始化块的示例,java,initialization,block,Java,Initialization,Block,我正在讨论以下主题: 我不明白我们是否有一个构造函数,在这里我们可以放置一些逻辑,比如处理异常情况,为什么我们需要初始化块,哪些代码我们也可以移动到构造函数 如果答案是在某些情况下,我们需要在构造函数运行之前初始化一些资源,那么您能帮我举一些例子吗,这样我就可以完全看到这幅图。您使用(我也使用过)静态初始化块的一个例子是初始化元素集合。例如,如果我有一组存储在静态映射中的解析器: private static Map<String, Parser> parsers = new

我正在讨论以下主题:

  • 我不明白我们是否有一个构造函数,在这里我们可以放置一些逻辑,比如处理异常情况,为什么我们需要初始化块,哪些代码我们也可以移动到构造函数


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

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

     private static Map<String, Parser> parsers = new HashMap<String, Parser>();
    
    我之所以这样做,是因为我希望贴图是静态的,而不是特定对象的一部分,或者如果我只希望有一个贴图(也许我只需要一个)

    这与构造函数的区别在于,构造函数在对象实例化时调用,而静态初始化块在类加载时调用

    也就是说,如果你打电话

    MyClass.parsers.get("node");
    

    MyClass
    构造函数永远不会被调用,因此如果在构造函数出现之前等待初始化
    解析器
    映射,上述调用将返回null。

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

     private static Map<String, Parser> parsers = new HashMap<String, Parser>();
    
    我之所以这样做,是因为我希望贴图是静态的,而不是特定对象的一部分,或者如果我只希望有一个贴图(也许我只需要一个)

    这与构造函数的区别在于,构造函数在对象实例化时调用,而静态初始化块在类加载时调用

    也就是说,如果你打电话

    MyClass.parsers.get("node");
    
    从不调用
    MyClass
    构造函数,因此,如果在构造函数出现之前等待初始化
    解析器
    映射,上述调用将返回null

    为什么我们需要初始化块

    例如初始化块,我只能考虑两种情况:

  • 创建匿名类时:

    Runnable runnable = new Runnable() {
        int x;
        //initialization block here
        {
            //IMO this is such odd design, it would be better to not
            //create this as an anonymous class
            x = outerClassInstance.someMethod();
        }
        @Override
        public void run() {
            //write the logic here...
        }
    };
    
  • 使用双大括号初始化时(如果类未标记为
    final
    ):

  • 为什么我们需要初始化块

    例如初始化块,我只能考虑两种情况:

  • 创建匿名类时:

    Runnable runnable = new Runnable() {
        int x;
        //initialization block here
        {
            //IMO this is such odd design, it would be better to not
            //create this as an anonymous class
            x = outerClassInstance.someMethod();
        }
        @Override
        public void run() {
            //write the logic here...
        }
    };
    
  • 使用双大括号初始化时(如果类未标记为
    final
    ):


  • 我脑子里没有现成的例子,所以这是一个评论。如果您不想在构造函数之间重复工作,那么初始化块很好。如果您想在初始化静态变量时做更复杂的工作,静态初始化块很好。@user3580294您可以调用另一个构造函数以避免在初始化块中放入逻辑。@LuiggiMendoza但可能存在这样的情况:我们有
    构造函数(字符串)
    构造函数(int)
    这个构造函数可以用不同的方式设置实例,所以它们不应该混合使用。@Pshemo在这种情况下使用生成器模式。@luigimendoza我开始想为什么我们实际上需要初始化块(不是静态块,例如在中它们可能很有用)我没有现成的例子,这是一个评论。如果您不想在构造函数之间重复工作,那么初始化块很好。如果您想在初始化静态变量时做更复杂的工作,静态初始化块很好。@user3580294您可以调用另一个构造函数以避免在初始化块中放入逻辑。@LuiggiMendoza但可能存在这样的情况:我们有
    构造函数(字符串)
    构造函数(int)
    这个构造函数可以用不同的方式设置实例,所以它们不应该混合使用。@Pshemo在这种情况下使用生成器模式。@luigimendoza我开始想为什么我们实际上需要初始化块(不是静态块,它们在实例中可能很有用)对于
    静态
    初始值设定项,我能找到的最好的例子是,必须从配置文件中检索常量变量,并且必须保持常量。@LuiggiMendoza Yeah,这是静态初始值设定项的一个很好的用法。
    静态
    初始值设定项的最佳示例是,必须从配置文件中检索常量变量,并且必须保持常量。@luigimendoza是的,这是静态初始值设定项的一个很好的用法