いくつかのコードをリファクタリングしているときに、この奇妙な点に遭遇しました。クラス全体に影響を与えずに初期化子の 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 にするとも言っています:
strictfp 修飾子の効果は、クラス宣言内 (変数初期化子、インスタンス初期化子、静的初期化子、およびコンストラクター内を含む) 内のすべての float または double 式を明示的に FP 厳密にすることです (§15.4)。
これは、クラスで宣言されたすべてのメソッド、およびクラスで宣言されたすべてのネストされた型が暗黙的に strictfp であることを意味します。
ということで、静的イニシャライザにモディファイヤを受け付けず、クラス全体に適用すると全てがstrictfpになる?strictfp キーワードの反対がないので、これは実現不可能ですか?
それで、静的メソッドを使用してイニシャライザ ブロックの本体を保持し、strictfp'dness を正確に制御することに夢中になっていますか?