在Java中,为什么没有关键字的代码块,只是大括号

Rig*_*ggy 20 java design-patterns

我正在重新考虑一些继承的代码,但是被设计决定所困扰,并且无法找出适当的条款来谷歌这一点.我的前任会使用像这样的块:

public class ChildClass extends ParentClass {
    {
        inheritedVar = "someVal";
    }

    public ChildClass(){ /* constructor exists */ }
    // rest of code
}
Run Code Online (Sandbox Code Playgroud)

声明没有关键字的代码块有什么意义?它不像静态块,我不相信.它是在构造函数中设置的替代方法吗?如果使用工厂(在这种情况下不是这样),这会产生一些影响吗?我在C中发现了一个相关的线程,但是推理(范围和变量声明)似乎与Java无关.

关于"为什么"的任何想法或想法将不胜感激.这很容易重新考虑这一点,我只是好奇这一点.

Mik*_*ike 33

它是一个初始化块.(与静态初始化程序块相关)请参见在此页面上初始化实例成员:

http://download.oracle.com/javase/tutorial/java/javaOO/initial.html

它是构造函数的替代品.您可以在提供多个重载构造函数时使用它作为共享代码的方法.

但是,就个人而言,我发现构造函数调用命名的初始化方法而不是依赖匿名代码块更清楚.虽然,编译器确实将初始化程序块复制到幕后的所有构造函数,但您可能会认为性能提升类似于内联方法声明.

  • +1:我同意命名的初始化方法.但是,鉴于只有一个构造函数,我的代码库中这个块的重点似乎毫无意义. (2认同)

Mar*_*ers 18

它被称为初始化块.

实例变量的初始化程序块看起来就像静态初始化程序块,但没有static关键字:

    {
        // whatever code is needed for initialization goes here
    }
Run Code Online (Sandbox Code Playgroud)

Java编译器将初始化程序块复制到每个构造函数中.因此,该方法可用于在多个构造函数之间共享代码块.