在重构一些代码时,我偶然发现了这种奇怪现象。在不影响整个类的情况下控制初始化器的 strictfp 属性似乎是不可能的。例子:
public class MyClass {
public final static float[] TABLE;
strictfp static { // this obviously doesn't compile
TABLE = new float[...];
// initialize table
}
public static float[] myMethod(float[] args) {
// do something with table and args
// note this methods should *not* be strictfp
}
}
从JLS 的第 8.1.1.3 节中,我收集到如果将使用 strictfp 修饰符声明类,则初始化程序将是 strictfp。但它也说它使所有方法都隐式地严格执行:
strictfp 修饰符的作用是使类声明中的所有浮点或双精度表达式(包括变量初始化器、实例初始化器、静态初始化器和构造器中)显式地为 FP-strict(第 15.4 节)。
这意味着类中声明的所有方法,以及类中声明的所有嵌套类型,都是隐式的 strictfp。
那么,静态初始化器不接受修饰符,当应用于整个类时,一切都变成了strictfp?既然没有strictfp关键字的对立面,这不可能实现吧?
那么,我是否搞砸了使用静态方法来保持初始化块的主体以实现对严格控制的精确控制?