2012-08-27 3 views
5

いくつかのコードをリファクタリングしているうちに、私はこの奇妙なことを見つけました。クラス全体に影響を与えることなく、イニシャライザの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'd​​nessを正確に制御するために、イニシャライザブロックの本体を保持するために静的メソッドを使用するようにネジ止めしましたか?要件使用

+0

なぜイニシャライザブロックを静的strictfpメソッドと呼びますか? –

+1

ヘルパークラスを使用してください! (静的イニシャライザでヘルパークラスメソッドを呼び出します。) – EthanB

+0

はい。はい。はい。しかし、私があなたのメソッドを '非公開 'にすると、私は大きな問題は見られません。修飾子をブロックに割り当てる方がいいかもしれませんが(おそらくクロージャを使ってこれが行われます)、 'private'メソッドはそのような内部実装のためのものです。だから、「ねじれた」は私にとっては過酷です。 「強制」は私にとってそれをより良く説明するだろう。 –

答えて

0

  • 初期化コードが一度呼び出されると、
  • MyClass.myMethod方法は、浮動小数点非厳密である、
  • クラスAPIはメソッドと「散らばっ」ではありません、
  • と初期化コード厳密な浮動小数点
あります

...これで十分です:あなたは別の、シングルトンオブジェクトにオブジェクトなどのクラスの静的メンバを考える場合

class MyClass { 
    //1) initialized/called once 
    public final static float[] TABLE = MyClassInitializer.buildSomething(); 

    public static float[] myMethod(float[] args) { 
    //2) non-strict 
    } 
} 

//3) doesn't "pollute" the MyClass API 
class MyClassInitializer { 
    strictfp [static] float[] buildSomething() { //4) strictfp here or on the class 
    //TODO: return something 
    } 
} 

、上記の例は自然だと思われます。私はこれがSingle Responsibility Principleでうまくいくと思います。

+0

他のクラスのイニシャライザコードを単純に非表示にします。私は別のクラスを持つことを避けたいと思っていましたが、これは最もクリーンな選択肢のようです。 – Durandal

+0

[情報隠蔽](http://ja.wikipedia.org/wiki/Information_hiding)勝利のために! – EthanB

+0

あなたはそれを私的な方法にすることはできませんか? – immibis

関連する問題