Singleton Java类可以具有静态常量变量吗?声纳皮棉错误

时间:2018-11-08 08:28:32

标签: java singleton constants static-analysis sonarlint

在Java单例类中,我想像下面的代码一样创建最终常量。

  1. new Date(parseInt(timestamp)*1000).toISOString() // Sonal lint的不兼容代码示例
  2. private final int threshold = 3; // Sonarlint的兼容代码

我的问题是,为什么单例类应该在private static final int THRESHOLD = 3; static / final常量中使用int关键字,因为该类只有一个实例?

3 个答案:

答案 0 :(得分:4)

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

虽然理论上您是对的(只有一个实例,所以该常量将仅被声明一次),但您最好还是省去以后将此代码的维护者的困惑(并且需要配置Sonar来忽略此警告) ),并将其也定义为static。如果编译器实际上内联它(仅适用于static final成员的那个AFAIK),那么您也可能会获得微小的内存消耗改善。

答案 1 :(得分:4)

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

private static final int THRESHOLD = 3;

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

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

private final int THRESHOLD = 3;

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

private final int threshold;

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

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

答案 2 :(得分:3)

Sonarlint不确定您要声明一个单例。它试图避免将来出现假想的错误。