0

当我试图更好地理解事物时,我意识到我知道的有多少。对不起,如果这听起来像一个简单或愚蠢的问题。

我们真的需要静态块吗,如果它仅用于初始化静态变量而没有在块中编码任何其他逻辑。我们可以直接对那些静态变量进行急切的初始化,对吧?因为据我了解,静态块在类加载时执行,静态变量的初始化也是如此。如果它只是用于变量初始化,那么让静态变量急切初始化是不够的,而不是为此拥有一个专有的静态块。

例如,采用以下代码,并将其称为案例 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

4 回答 4

2

我认为如果你需要初始化一个可用的起始值的静态变量,你可以使用Case 2,而如果你需要根据一些逻辑操作来初始化一个变量,你可以把它放在一段静态代码中,然后执行他的通过它初始化

于 2018-11-23T16:49:12.523 回答
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一行中,因此静态块使初始化值更容易(并且对维护者来说更具可读性)。

于 2018-11-23T17:02:30.040 回答
1

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

private static int n;
private static String s;
static {
    if (someExpensiveOperation()) {
        n = 123;
        s = "foo";
    } else {
        n = 456;
        s = "bar";
    }
}
于 2018-11-23T17:49:48.497 回答
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);

于 2018-11-23T17:36:46.490 回答