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



在Java singleton类中,我想生成一个最后的常量,如下代码所示。

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

我的问题是,为什么singleton类只有一个实例,就应该在finalint/string常量中包含static关键字?

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

虽然理论上你是对的(只有一个实例,所以常数无论如何只会声明一次(,但你可能会更好地避免这段代码的未来维护者的困惑(以及需要配置Sonar来忽略这个警告(,并将其定义为static。如果编译器真的内联它,那么您还可以获得一分钟的内存消耗改进,而AFAIK只对static final成员这样做。

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

private static final int THRESHOLD = 3;

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

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

private final int THRESHOLD = 3;

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

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

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

Sonarlint不确定您是否声明了一个singleton。它试图避免将来出现假设的错误。

最新更新