Singleton Java class 可以有静态常量变量吗?声纳棉绒错误
Singleton Java class can have static constant variable ? Sonar lint error
在 Java 单例 class 中,我想创建一个如下代码所示的最终常量。
private final int threshold = 3;
// Sonal lint 的不合规代码示例
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 不确定您是否在声明单例。它试图避免将来出现假设错误。
在 Java 单例 class 中,我想创建一个如下代码所示的最终常量。
private final int threshold = 3;
// Sonal lint 的不合规代码示例
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 不确定您是否在声明单例。它试图避免将来出现假设错误。