java 中何时使用初始化程序块?
When are initializer blocks used in java?
我读到初始化程序块是“一个未命名的代码块,其中包含初始化 class 的代码?
例如:
class A {
final int x;
final int y;
final String n;
{
x = 10;
y = 20;
}
public A(String name ) {
/* etc... etc */
我从未见过使用过这种类型的代码,所以我想知道它可能对哪些地方有帮助。为什么我们不直接在构造函数中初始化变量?
谢谢
一个常见的用法是 static initializer block
:
class A {
static boolean verbose;
final int x;
final int y;
final String n;
static {
verbose = doSomethingToGetThisValue();
}
public A(String name ) {
/* etc... etc */
这很有用,因为在创建 class 的实例之前(因此在调用构造函数之前),您的静态变量可能会被静态方法使用。
另见 this SO answer。
我认为有时在定义变量时立即对其进行初始化会很有帮助。
public class Stooges {
private ArrayList<String> stooges = new ArrayList<>();
{ stooges.add("Lary"); stooges.add("Curly"); stooges.add("Moe"); }
// ... etc. other methods.
}
该初始值设定项现在对所有构造函数都是通用的,因此它避免了代码重复。您可以使用私有方法并从所有构造函数中调用类似的代码,但这种方式甚至可以避免记住插入方法调用。减少维护!
可能还有其他例子。如果初始化代码调用了一个抛出异常的方法,那么你就不能直接给它赋值。您必须捕获异常。
我读到初始化程序块是“一个未命名的代码块,其中包含初始化 class 的代码?
例如:
class A {
final int x;
final int y;
final String n;
{
x = 10;
y = 20;
}
public A(String name ) {
/* etc... etc */
我从未见过使用过这种类型的代码,所以我想知道它可能对哪些地方有帮助。为什么我们不直接在构造函数中初始化变量?
谢谢
一个常见的用法是 static initializer block
:
class A {
static boolean verbose;
final int x;
final int y;
final String n;
static {
verbose = doSomethingToGetThisValue();
}
public A(String name ) {
/* etc... etc */
这很有用,因为在创建 class 的实例之前(因此在调用构造函数之前),您的静态变量可能会被静态方法使用。
另见 this SO answer。
我认为有时在定义变量时立即对其进行初始化会很有帮助。
public class Stooges {
private ArrayList<String> stooges = new ArrayList<>();
{ stooges.add("Lary"); stooges.add("Curly"); stooges.add("Moe"); }
// ... etc. other methods.
}
该初始值设定项现在对所有构造函数都是通用的,因此它避免了代码重复。您可以使用私有方法并从所有构造函数中调用类似的代码,但这种方式甚至可以避免记住插入方法调用。减少维护!
可能还有其他例子。如果初始化代码调用了一个抛出异常的方法,那么你就不能直接给它赋值。您必须捕获异常。