我使用Sonarqube 5.1并尝试使用“Sonar way”Java质量配置文件。工作很简单:我想为缺少的媒体类型定义全局字符串常量:
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支持)。 我能做些什么呢?你推荐什么?
答案 0 :(得分:3)
让步。让它成为一个类,添加一个私有构造函数,在单元测试中使用内省。使代码大十倍。对于String常量。
这是一般的正确方法。你真的不想创建一个“常量”界面。需要私有构造函数来确保用户不会无意中扩展或实例化不应实例化的对象。
How to add test coverage to a private constructor?
创建例外列表。但是,为每个项目执行此操作可能会导致长列表,并邀请人们甚至为重要事项添加例外。
工作太多了。
停用规则。现在我不想篡改默认配置文件,因为这可能意味着Sonarqube升级的很多工作。
正如你所说......糟糕的主意。
创建一个继承自默认值并覆盖内容的配置文件。事实证明,当您从配置文件继承时,您无法停用规则。您只能添加其他规则并更改规则配置(以降低其严重性)。
如果将严重性设置为“info”,它将从技术债务计算中删除它。我必须使用squid:S1213
执行此操作,这是在使用Eclipse指定的默认顺序进行排序时引发的。
答案 1 :(得分:0)
问了已经有好几年了,但sonarlint仍在抱怨
public interface Utf8MediaType {
String APPLICATION_JSON = "application/json;charset=UTF-8";
}
现在sonarlint提出了
public final class Utf8MediaType {
public static final String APPLICATION_JSON = "application/json;charset=UTF-8";
}
但是我仍然不喜欢使用public static final
时不需要的这些“额外” interface
。在我们的项目中,我们过渡到Kotlin,可以逐个文件地进行操作,方法是:
object Utf8MediaType {
const val APPLICATION_JSON = "application/json;charset=UTF-8"
}
比Java接口还要短。