Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何创建(静态)初始值设定项块?_Java_Scope_Declaration_Strictfp - Fatal编程技术网

Java 如何创建(静态)初始值设定项块?

Java 如何创建(静态)初始值设定项块?,java,scope,declaration,strictfp,Java,Scope,Declaration,Strictfp,在重构一些代码时,我无意中发现了这个奇怪之处。似乎不可能在不影响整个类的情况下控制初始值设定项的strictfp属性。例如: public class MyClass { public final static float[] TABLE; strictfp static { // this obviously doesn't compile TABLE = new float[...]; // initialize table }

在重构一些代码时,我无意中发现了这个奇怪之处。似乎不可能在不影响整个类的情况下控制初始值设定项的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。但它也说它使所有方法都隐式严格:

strictfp修饰符的作用是使类声明(包括变量初始值设定项、实例初始值设定项、静态初始值设定项和构造函数)中的所有浮点或双精度表达式显式为FP-strict(§15.4)

这意味着类中声明的所有方法以及类中声明的所有嵌套类型都是隐式strictfp

因此,静态初始值设定项不接受修饰符,并且当应用于整个类时,所有内容都变得strictfp?因为strictfp关键字没有对立面,所以这是不可能实现的


那么,我是否需要使用静态方法来固定初始化程序块的主体,以实现对严格性的精确控制?

使用以下要求:

  • 初始化代码被调用一次
  • 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
  }
}

如果您认为类的静态成员是单独的单例对象中的对象,那么上面的示例看起来很自然。我认为这很好地解决了。

为什么使初始值设定项块调用静态strictfp方法是一个问题?使用帮助器类!(在静态初始值设定项中调用helper类方法。)是。对对但是如果将方法
设置为私有
,我看不出有什么问题。虽然将修饰符分配给块(可能会有闭包)会更好,
private
方法用于此类内部实现。所以“搞砸”对我来说太苛刻了。“Forced”这个词对我来说更合适。在静态块中需要它有什么特别的原因吗?@Woot4Moo好吧,我认为在静态初始值设定项中初始化静态表要比使用私有静态方法更清楚(它不会丢弃类的名称空间,并且不可能多次调用初始化的名称空间)。因此,我认为从逻辑上讲,初始化程序块是可以使用的机制。我明白了,您只需将初始化程序代码隐藏在另一个类中。虽然我希望避免使用另一个类,但这似乎是最干净的选择。为了赢!您不能将其作为私有方法吗?您当然可以。(在他的评论中,OP不想这样做。)“丢弃类的名称空间”并希望“[使]不可能多次调用初始值设定项”。因此此解决方案。)