我正在使用默认的类字段初始化。我想这些字段将按如下顺序初始化:
class NormalInit {
int i = 3;
LocalDate h = LocalDate.now();
public int year = h.getYear(); // is it safe?
}
我的问题:
(1)我对序列的假设是否正确(由Java或jvm规范保证吗?
(2)这种初始化是否有常见的失败/陷阱?
答案 0 :(得分: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)。
对i
和h
的技术分配可以重新排序,但是在您的情况下,它不会对程序的语义产生任何影响。
答案 1 :(得分:1)
h
取决于year
,JVM不会重新排序这些分配。
但是i
没有依赖性,因此JVM可以在构造的任何时刻将其初始化。