使用静态init块

gam*_*ver 9 java static-initializer

我知道静态init块是如何工作的.
任何人都可以告诉我它的一些典型用途.

Boz*_*zho 10

当您想在一个地方初始化一个或多个静态变量时

它很有用,因为您可以应用异常处理,这在内联初始化时是不可能的.

例如:

public static ImageIcon defaultIcon = ImageIO.read(..);
Run Code Online (Sandbox Code Playgroud)

可以用.初始化

public static ImageIcon defaultIcon;
static {
   try {
       defaultIcon = ImageIO.read(..);
   } catch (IOException ex){
     System.out.println("No default icon available");
   }
}
Run Code Online (Sandbox Code Playgroud)

另一个应用是复杂的初始化 例如,如果某个项目需要初始化多行代码.假设你有一个配置:

public static Configuration configuration;
static {
     confuguration = new Configuration();
     configuration.setSomething(..);
     configuration.setSomethingElse(..);
     ...
}
Run Code Online (Sandbox Code Playgroud)

第三种用法是初始化一些外部API基础结构.我当前项目的一个例子:

static {
    org.apache.xml.security.Init.init();
}
Run Code Online (Sandbox Code Playgroud)

但是,正如Mykola Golubyev所指出的,静态初始化块会降低代码的可读性,因此请谨慎使用它们.静态方法更透明地做同样的事情.


Myk*_*yev 5

只是尽量避免使用静态初始化块.相反,您可以使用私有静态初始化函数,这将使您的代码更干净.

我将参考@Bozho的例子.

不要做

public static Configuration configuration;
static {
     confuguration = new Configuration();
     configuration.setSomething(..);
     configuration.setSomethingElse(..);
     ...
}
Run Code Online (Sandbox Code Playgroud)

请改用

public static Configuration configuration = createConfiguration();
Run Code Online (Sandbox Code Playgroud)

要么

public static Configuration configuration = YourConfiguration.create();
Run Code Online (Sandbox Code Playgroud)