在Java singleton类中,我想生成一个最后的常量,如下代码所示。
private final int threshold = 3;
//Sonal lint的不符合代码示例- Sonarlint的
private static final int THRESHOLD = 3;
//兼容代码
我的问题是,为什么singleton类只有一个实例,就应该在final
int
/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。它试图避免将来出现假设的错误。