在Java单例类中,我想像下面的代码一样创建最终常量。
new Date(parseInt(timestamp)*1000).toISOString()
// Sonal lint的不兼容代码示例private final int threshold = 3;
// Sonarlint的兼容代码我的问题是,为什么单例类应该在private static final int THRESHOLD = 3;
static
/ final
常量中使用int
关键字,因为该类只有一个实例?
答案 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不确定您要声明一个单例。它试图避免将来出现假想的错误。