急于初始化静态块

时间:2018-11-23 16:45:55

标签: java static-variables static-block variable-initialization

当我试图更好地理解事物时,我意识到自己所掌握的知识很少。很抱歉,如果这听起来像是一个简单或愚蠢的问题。

我们是否真的需要静态块,如果它仅用于STATIC变量的初始化而该块中未编码任何其他逻辑。我们可以直接对那些静态变量进行急切的初始化,对吗?因为据我了解,静态块在类加载时执行,因此静态变量的初始化也是如此。而且,如果仅用于变量初始化,则不足以对静态变量进行急于初始化,而不是为此专门设置一个静态块。

例如,采用以下代码,并将其称为案例1。

static String defaultName = null;
static String defaultNumber = 0;
static {
defaultName  = "John";
defaultNumber = "+1-911-911-0911";
}     

和下面的代码,并称为案例2。

static String defaultName = "John";
static String defaultNumber = "+1-911-911-0911";

因此,案例1和案例2的结果或性能都不相同。在这种情况下(为了将可读性,例如将所有数据初始化在一个位置左右),在这种情况下,情况2完全是干净的吗?我想念什么?

4 个答案:

答案 0 :(得分:2)

我认为,如果需要使用可用的起始值来初始化静态变量,则可以使用案例2,而如果您需要根据一些逻辑运算来初始化变量,则可以将其放在静态代码块中并通过它进行初始化

答案 1 :(得分:1)

显然,人们永远不会喜欢案例1。对于案例2,有时初始化比在一行中完成要复杂得多。

public final class Stooges {

   private final static Map<String,String> stooges = new HashMap<>();
   static {
      stooges.put( "Larry", "Larry Fine" );
      stooges.put( "Moe", "Moe Howard" );
      stooges.put( "Curly", "Curly Howard" );
   }
}

在这里,您无法轻易地将stooges的初始化放在一行中,因此静态块使初始化值更容易(对于维护者而言更容易读取)。

答案 2 :(得分:1)

可能要使用静态块的一个原因是,如果要设置多个变量:

private static int n;
private static String s;
static {
    if (someExpensiveOperation()) {
        n = 123;
        s = "foo";
    } else {
        n = 456;
        s = "bar";
    }
}

答案 3 :(得分:0)

在将类加载到内存中然后对变量进行初始化时执行逻辑操作或处理时使用静态块

示例:

public class R {

  public static int example;

  static {
    int example1 = 2 + 3;
    example = example1;
  }


  public static void main(String[] args) {
    System.out.println(example);   // print 5
  }

}

如果该值是已知的,则可以直接分配(情况2);