簡體   English   中英

急於初始化靜態塊

[英]Eager Initialization over static block

當我試圖更好地理解事物時,我意識到自己所知道的少得多。 很抱歉,如果這聽起來像是一個簡單或愚蠢的問題。

我們是否真的需要靜態塊,如果它僅用於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完全是干凈的嗎? 我想念什么?

我認為,如果需要使用可用的起始值來初始化靜態變量,則可以使用案例2,而如果您需要根據一些邏輯運算來初始化變量,則可以將其放在靜態代碼塊中並執行通過它初始化

顯然,人們永遠不會喜歡情況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的初始化放在一行中,因此static塊使初始化值更容易(對於維護者來說更易讀)。

您可能會使用靜態塊的一個原因是,如果您要設置多個變量:

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

在將類加載到內存中然后初始化變量時,在執行邏輯操作或處理時使用靜態塊

例:

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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM