Singleton Java class 可以有静态常量变量吗?声纳棉绒错误

Singleton Java class can have static constant variable ? Sonar lint error

在 Java 单例 class 中,我想创建一个如下代码所示的最终常量。

  1. private final int threshold = 3; // Sonal lint
  2. 的不合规代码示例
  3. private static final int THRESHOLD = 3; // Sonarlint 的合规代码

我的问题是,为什么单例 class 应该在 final int/string 常量中有 static 关键字,因为这个 class只有一个实例?

这可能是Sonar Lint无法识别的警告。使用静态分析很难识别单例,因此他们只是选择忽略此警告并发出警告。

虽然理论上你是对的(只有一个实例,所以常量无论如何只会被声明一次),你最好不要让这段代码的未来维护者感到困惑(并且需要配置 Sonar 以忽略此警告),并将其也定义为 static。如果编译器实际内联它,您也可能会获得一分钟的内存消耗改进,据我所知,它只对 static final 成员进行内联。

这是java中常量的普通声明。

private static final int THRESHOLD = 3;

这意味着您的 class 的所有实例都将访问 相同的 字段。

当您像 private final int THRESHOLD = 3; 那样声明它时,这意味着您的 class 的每个实例都将有 自己的 THRESHOLD 字段的副本。当你立即初始化它时声明它是非静态的没有任何意义:

private final int THRESHOLD = 3;

在构造函数中初始化它们时,声明非静态最终字段很有意义。因此所有实例都有相同的常量字段,但值不同:

private final int threshold;

protected YourConstructor(int threshold){
    this.threshold = threshold;
}

只需遵循 Sonarlint 的建议并将其声明为 static 常量即可。

Sonarlint 不确定您是否在声明单例。它试图避免将来出现假设错误。