我使用Sonarqube5.1和实验“声纳方式”的Java质量概要文件。任务很简单:我想为缺少的媒体类型定义一个全局字符串常量:
public interface Utf8MediaType {
String APPLICATION_JSON = "application/json;charset=UTF-8";
}但是,Sonarqube告诉我,这是乌贼规则中的错误做法:S 1214-常量不应该在接口中定义。长文讨论了实现这个接口的问题,我并不打算这样做,但我放弃并创建了一个类:
public class Utf8MediaType {
public static final String APPLICATION_JSON = "application/json;charset=UTF-8";
}然而,这被认为是规则squid中的一个主要设计问题:S 1118-实用程序类不应该有公共构造函数。所以它敦促我添加一个私有构造函数。当然,这个构造函数必须首先不违反规则squid:s 1213中的约定--接口声明或类的成员应该以预定义的顺序出现。在那之后,我想我甚至可能会变得很普通-java:InsufficientBranchCoverage,因为私有构造函数没有包含在测试中。
这些都是默认的规则,我觉得它们结合起来有点傻。我有更多的例子说明默认值对我们不起作用(缺少TestNG支持)。我能做些什么?你有什么建议吗?
发布于 2015-07-10 20:19:46
投降吧。使它成为一个类,添加一个私有构造函数,在单元测试中使用内省。把代码做了十倍大。一个字符串常量。
一般来说,这是正确的做法。您确实不想创建一个“常量”接口。需要私有构造函数来确保用户不会无意中扩展或实例化不应该实例化的对象。
How to add test coverage to a private constructor?
创建一个异常列表。但是,为每个项目这样做可能会导致长列表,并邀请人们添加例外,即使是重要的事情。
工作太多了。
停用规则。现在我不想篡改默认配置文件,因为这可能意味着在Sonarqube升级方面做了大量工作。
正如你说的..。馊主意。
创建一个从默认继承并覆盖事物的配置文件。原来,当您从配置文件继承时,您不能停用规则。您只能添加其他规则并更改规则的配置(以降低其严重性)。
如果您将严重性设置为"info“,它将从技术债务计算中删除它。我必须使用squid:S1213来完成这个操作,这是在使用Eclipse指定的默认顺序进行排序时引发的。
发布于 2019-10-04 00:26:32
问这个问题已经有几年了,但是声纳林特还在抱怨
public interface Utf8MediaType {
String APPLICATION_JSON = "application/json;charset=UTF-8";
}现在声纳林特提出
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接口还短。
https://stackoverflow.com/questions/30523430
复制相似问题