【问题标题】:Singleton Java class can have static constant variable ? Sonar lint error单例 Java 类可以有静态常量变量吗?声纳棉绒错误
【发布时间】:2018-11-08 08:28:31
【问题描述】:

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

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

我的问题是,为什么单例类应该在 final int/string 常量中包含 static 关键字,因为这个类只有一个实例?

【问题讨论】:

  • 您只是不遵守命名约定。只有静态最终变量应该在 ALL_CAPS 中。最终实例字段,无论是否在单例中,都是 camelCased。
  • @Pshemo 我不确定,但我期待答案。
  • @JBNizet 我同意,我的问题仅针对 sonarlint 错误。

标签: java singleton constants static-analysis sonarlint


【解决方案1】:

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

虽然理论上你是对的(只有一个实例,所以无论如何这个常量只会被声明一次),你最好不要让这个代码的未来维护者感到困惑(并且需要配置 Sonar 来忽略这个警告),也只需将其定义为static。如果编译器实际上内联它,您还可以获得一分钟的内存消耗改进,这 AFAIK,它只对 static final 成员起作用。

【讨论】:

  • 对我来说似乎是有意义的回答。
【解决方案2】:

这是一个普通的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 常量。

【讨论】:

  • 我的班级是单例的,这意味着只有一个实例。上面的代码似乎是针对普通类而不是单例的,因为它具有公共构造函数。
  • @Ashutoshg 好吧,这只是一个例子。在您的情况下,代码分析器不能保证您将拥有唯一的实例。理论上,稍后您可能希望将您的singleton 转换为multiton。所以 Sonarlint 可以防止未来的错误。
【解决方案3】:

Sonarlint 不确定您声明的是单例。它试图避免将来出现假设的错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-05
    • 2016-11-10
    • 1970-01-01
    • 2013-07-02
    • 2010-09-09
    相关资源
    最近更新 更多