[英]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.