静态块上的急切初始化
Eager Initialization over static block
当我试图更好地理解事物时,我意识到我知道的是多么少。很抱歉,如果这听起来像是一个简单或愚蠢的问题。
我们真的需要静态块吗,如果它仅用于初始化 STATIC 变量而没有在块中编码任何其他逻辑。我们可以直接对那些静态变量进行热切初始化,对吧。因为据我了解,静态块在 class 加载时执行,静态变量的初始化也是如此。而且,如果它仅用于变量初始化,则不足以让静态变量急切初始化,而不是为此设置一个独占的静态块。
例如,将下面的代码命名为案例 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";
所以,不要Case 1和Case 2,给出相同的结果或性能。在这种情况下(出于任何目的,例如将所有数据初始化都放在一个地方左右),静态块是否有必要,而案例 2 的目的是清晰明了?我错过了什么?
我觉得如果需要初始化一个有起始值的静态变量,可以使用Case 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
的初始化放在一行中,因此静态块使初始化值更容易(并且对于维护者而言更具可读性)。
在class加载到内存然后初始化变量时进行逻辑操作或处理时使用静态块
示例:
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);
您可能使用静态块的一个原因是如果您想要设置多个变量:
private static int n;
private static String s;
static {
if (someExpensiveOperation()) {
n = 123;
s = "foo";
} else {
n = 456;
s = "bar";
}
}
当我试图更好地理解事物时,我意识到我知道的是多么少。很抱歉,如果这听起来像是一个简单或愚蠢的问题。
我们真的需要静态块吗,如果它仅用于初始化 STATIC 变量而没有在块中编码任何其他逻辑。我们可以直接对那些静态变量进行热切初始化,对吧。因为据我了解,静态块在 class 加载时执行,静态变量的初始化也是如此。而且,如果它仅用于变量初始化,则不足以让静态变量急切初始化,而不是为此设置一个独占的静态块。
例如,将下面的代码命名为案例 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";
所以,不要Case 1和Case 2,给出相同的结果或性能。在这种情况下(出于任何目的,例如将所有数据初始化都放在一个地方左右),静态块是否有必要,而案例 2 的目的是清晰明了?我错过了什么?
我觉得如果需要初始化一个有起始值的静态变量,可以使用Case 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
的初始化放在一行中,因此静态块使初始化值更容易(并且对于维护者而言更具可读性)。
在class加载到内存然后初始化变量时进行逻辑操作或处理时使用静态块
示例:
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);
您可能使用静态块的一个原因是如果您想要设置多个变量:
private static int n;
private static String s;
static {
if (someExpensiveOperation()) {
n = 123;
s = "foo";
} else {
n = 456;
s = "bar";
}
}