Java8表达式求值序列

Java8表达式求值序列,java,java-8,Java,Java 8,我有一个这样的案子 MyClass.invoke( anObject.setSystem() ); 是否保证在加载MyClass之前调用anObject.setSystem()?因为MyClass的初始化代码取决于anObject.setSystem()的结果 它是用Java8运行的。如有任何建议/提示,将不胜感激。非常感谢MyClass将被加载,其所有静态字段和静态初始值设定项将在调用MyClass.invoke()之前初始化 看 类或接口类型T将在第一次出现以下任一情况之前立即初始化: T

我有一个这样的案子

MyClass.invoke( anObject.setSystem() );
是否保证在加载MyClass之前调用
anObject.setSystem()
?因为MyClass的初始化代码取决于
anObject.setSystem()
的结果


它是用Java8运行的。如有任何建议/提示,将不胜感激。非常感谢

MyClass
将被加载,其所有静态字段和静态初始值设定项将在调用
MyClass.invoke()
之前初始化

类或接口类型T将在第一次出现以下任一情况之前立即初始化:
  • T是一个类,并且创建了T的一个实例。
  • T是一个类,调用由T声明的静态方法。所以invoke是一个静态方法?你所说的“loaded”是什么意思?它是一种非常危险的方法,因为以前有人可能使用MyClass中的其他方法,所以它将被加载无论是否有保证,我都不会让你的代码具有如此脆弱、不可见的依赖性。最好将这种依赖项显式化。invoke是一个静态方法。Loaded表示执行MyClass的静态初始化部分。这样做的原因是我需要在运行时进行一些初始化,并且必须在一个Object.setSystem()之后进行。我只希望这些初始化完成一次。问题不是在调用
    MyClass.invoke()
    之前是否加载
    MyClass
    (我想,这是可以理解的),而是在调用
    anObject.setSystem()
    之后是否加载
    MyClass
    。确切地说,是Holger。感谢您对我所做的澄清,我的类是在执行一个Object.setSystem()之后加载的,这一点很好。我曾假设,由于对anObject.setSystem()的求值仅在MyClass.invoke求值的要求下进行,并且MyClass.invoke只会在MyClass初始化之后进行求值,因此,以传递方式,MyClass将在触发求值anObject.setSystem()的求值之前进行初始化。那么,问题是MyClass.invoke求值的开始会导致MyClass被初始化,还是调用anObject.setSystem()后调用invoke()会导致MyClass被初始化?我想你是对的。调用MyClass的invoke方法会触发其加载