いくつかのコードをリファクタリングしているうちに、私はこの奇妙なことを見つけました。クラス全体に影響を与えることなく、イニシャライザのstrictfpプロパティを制御することは不可能です。例:私はクラスがstrictfp修飾子を使用して宣言されるだろう場合初期化子がをstrictfpのことだろうと集まっJLS, Section 8.1.1.3から(static)イニシャライザブロックを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
}
}
。しかし、それはまた、すべてのメソッドを作ると言う暗黙的にはstrictfp:
strictfp修飾子の効果は、クラス宣言内のすべてのfloatまたはdouble表現が(変数初期化子、インスタンス初期化子、静的初期化子内を含むようにすることですし、コンストラクタ)は明示的にFP厳密(15.4)である必要があります。
これは、クラスで宣言されたすべてのメソッドと、クラスで宣言されたすべてのネストされた型が暗黙的にstrictfpであることを示します。
したがって、修飾子は静的初期化子には受け入れられず、クラス全体に適用するとすべてがstrictfpになりますか? strictfpキーワードと反対ではないので、これは実現不可能ですか?
私はstrictfp'dnessを正確に制御するために、イニシャライザブロックの本体を保持するために静的メソッドを使用するようにネジ止めしましたか?要件使用
なぜイニシャライザブロックを静的strictfpメソッドと呼びますか? –
ヘルパークラスを使用してください! (静的イニシャライザでヘルパークラスメソッドを呼び出します。) – EthanB
はい。はい。はい。しかし、私があなたのメソッドを '非公開 'にすると、私は大きな問題は見られません。修飾子をブロックに割り当てる方がいいかもしれませんが(おそらくクロージャを使ってこれが行われます)、 'private'メソッドはそのような内部実装のためのものです。だから、「ねじれた」は私にとっては過酷です。 「強制」は私にとってそれをより良く説明するだろう。 –