【问题标题】:Java: is there any risk to depend on field initializing sequence?Java:依赖字段初始化序列是否有风险?
【发布时间】:2019-01-05 04:06:42
【问题描述】:

我正在使用像这样的类字段的默认初始化。我想这些字段将按如下顺序初始化:

class NormalInit {
    int i = 3;
    LocalDate h = LocalDate.now();
    public int year = h.getYear(); // is it safe?
}

我的问题:

(1) 我对序列的假设是否正确(java 或 jvm 规范是否保证)?

(2) 这种初始化有什么常见的失败/陷阱吗?

【问题讨论】:

    标签: java initialization field sequence


    【解决方案1】:

    应该没问题。根据java内存模型和语言规范,语句在单线程中从上到下求值。

    初始化块的顺序https://docs.oracle.com/javase/specs/jls/se8/html/jls-12.html#jls-12.4

    4.执行该类的实例初始化器和实例变量初始化器,将实例变量初始化器的值分配给相应的实例变量,按照它们在源代码中的文本出现的从左到右的顺序.如果执行这些初始化程序中的任何一个导致异常,则不会处理更多初始化程序,并且此过程会突然完成并出现相同的异常

    此链接用于发生之前的解释:https://docs.oracle.com/javase/specs/jls/se8/html/jls-17.html#jls-17.4.5

    如果 x 和 y 是同一线程的操作,并且 x 在程序顺序中位于 y 之前,则为 hb(x, y)。

    技术上分配给ih 可以重新排序,但在您的情况下,它不会对程序的语义产生任何影响。

    【讨论】:

      【解决方案2】:

      h 依赖于year,JVM 不会重新排序这些分配。

      但是i没有依赖关系,所以JVM可以在构造的任何时候把它放在init。

      【讨论】:

        猜你喜欢
        • 2020-02-15
        • 2012-08-19
        • 1970-01-01
        • 2021-08-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-10-23
        • 1970-01-01
        相关资源
        最近更新 更多