繁体   English   中英

初始化静态最终变量

[英]Initialize static final variable

我想知道,有什么不同,在各种方法初始化静态最终变量?

private static final int i = 100;

要么

private static final int i;
static {
    i = 100;
}

这两者有什么不同吗?

如果你只是设置变量,那么两种形式都是等价的(你应该使用前者,因为它更具可读性和简洁性)。

static {}表单适用于您还需要执行除变量赋值之外的语句的情况。 (有点做作)的例子:

private static final int i;
static {
    establishDatabaseConnection();
    i = readIntFromDatabase;
    closeDatabaseConnection();
}

静态块的主要原因是能够在初始化中添加一些逻辑,而不是在1行初始化中进行,例如初始化数组或其他东西。

是的,通过使用第二种方式,您可以使用try ... catch块并对异常做出反应,因为第一种方式无法捕获声明的异常。

在init类中执行字段和执行静态块时也有区别,但我没有详细信息,请参阅类实例化的语言规范以获取更多信息。

格雷茨,GHad

对于原始变量,什么都没有。 不同之处可能是初始化不是微不足道的,或者init方法/构造函数抛出一个已检查的异常 - 那么您需要一个static块才能处理异常。

它们是相同的,除了你可以在静态代码块中写多行。

请参阅java的官方文章

您还可以使用前向参考初始化

public class ForwardReference {
private static final int i  = getValue();
private static final int j = 2;
public static void main(String[] args) {
    System.out.println(i);
}

private static int getValue() {
    return j*2;
}

}

这里的关键是我们在声明'j'之前从'getValue'获得'j'的值。 静态变量按其出现的顺序初始化。

这将打印正确的值'4'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM