gpt4 book ai didi

java - 如何制作(静态)初始化程序 block strictfp?

转载 作者:搜寻专家 更新时间:2023-11-01 00:57:42 28 4
gpt4 key购买 nike

在重构一些代码时,我偶然发现了这个奇怪的地方。似乎不可能在不影响整个类的情况下控制初始化程序的 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, Section 8.1.1.3我收集到初始化器将是 strictfp 如果类将使用 strictfp 修饰符声明。但它也说它使所有方法隐式 strictfp:

The effect of the strictfp modifier is to make all float or double expressions within the class declaration (including within variable initializers, instance initializers, static initializers, and constructors) be explicitly FP-strict (§15.4).

This implies that all methods declared in the class, and all nested types declared in the class, are implicitly strictfp.

所以,静态初始化器不接受修饰符,当应用于整个类时,一切都变成 strictfp 了?既然strictfp关键字没有反义词,这就不可能实现了?

那么,我是不是被搞砸了使用静态方法来保存初始化 block 的主体以实现对 strictfp'd​​ness 的精确控制?

最佳答案

使用要求:

  • 初始化代码被调用一次,
  • MyClass.myMethod 方法是非严格 float ,
  • 类 API 没有“乱七八糟”的方法,
  • 初始化代码严格的 float

...这就足够了:

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 配合得很好.

关于java - 如何制作(静态)初始化程序 block strictfp?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12145114/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com