【发布时间】:2015-08-11 22:58:21
【问题描述】:
我使用 Sonarqube 5.1 并尝试使用“Sonar way”Java 质量配置文件。工作很简单:我想为缺少的媒体类型定义一个 global 字符串常量:
public interface Utf8MediaType {
String APPLICATION_JSON = "application/json;charset=UTF-8";
}
然而,Sonarqube 告诉我这是规则 squid:S1214 中的不好做法——不应在接口中定义常量。长篇大论讲的是实现这个接口,我本来不打算这么做的,但我放弃并创建了一个类:
public class Utf8MediaType {
public static final String APPLICATION_JSON = "application/json;charset=UTF-8";
}
然而,这被认为是规则 squid:S1118 中的一个主要设计问题——实用程序类不应具有公共构造函数。所以它敦促我添加一个私有构造函数。当然,这个构造函数首先必须不违反规则 squid:S1213 中的约定——接口声明或类的成员应该以预定义的顺序出现。我想在那之后我什至可能会得到 common-java:InsufficientBranchCoverage 因为私有构造函数没有包含在测试中。
这些是默认规则,我觉得它们组合起来有点傻。我有更多默认设置对我们不起作用的示例(缺少对 TestNG 的支持)。 我能做些什么呢?你有什么推荐的?
- 让步。让它成为一个类,添加一个私有构造函数,在单元测试中使用自省。使代码大十倍。对于字符串常量。
- 创建一个例外列表。但为每个项目执行此操作可能会导致列表过长,并邀请人们添加例外,即使是重要的东西。
- 停用规则。现在我希望不要篡改默认配置文件,因为这可能意味着在 Sonarqube 升级方面需要做大量工作。
- 创建一个从默认继承并覆盖内容的配置文件。事实证明,当您从配置文件继承时,您不能停用 规则。您只能添加其他规则并更改规则配置(以降低其严重性)。
【问题讨论】:
-
“你不能禁用规则”
-
好吧,@fge,如果我知道怎么做,我会去做。那是我个人的喜好。
-
以管理员身份登录,单击“规则”选项卡,选择您使用的配置文件,找到规则并单击“停用”按钮...
-
我的 Sonarqube 版本中没有“停用”按钮。请注意,我提到了从另一个配置文件继承的配置文件。当我的配置文件“My way”继承自“Sonar way”时,该按钮仅位于规则的“Sonar way”行上。
-
媒体类型用作某些注释的值。因此它们必须是字符串,并且必须是编译时常量。