6

いくつかのコードをリファクタリングしているときに、この奇妙な点に遭遇しました。クラス全体に影響を与えずに初期化子の 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'd​​ness を正確に制御することに夢中になっていますか?

4

1 に答える 1

1

次の要件を使用します。

  • 初期化コードが一度呼び出され、
  • メソッドは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
  }
}

クラスの静的メンバーを別のシングルトン object 内のオブジェクトと考えると、上記の例は自然に見えます。これは、 Single Responsibility Principleと非常にうまく連携していると思います。

于 2012-08-29T17:47:06.713 に答える