声纳抱怨“应该使用钻石操作员(“ <>”)”

时间:2018-08-31 15:07:24

标签: java sonarqube sonarqube-scan

因此我的文件中包含以下代码行

List<String> nameList = new ArrayList<String>();

现在,每次我运行声纳扫描时,上面一行都会显示一个错误,提示我应该使用菱形运算符。现在我知道从Java7编译器会自动检测并为ArrayList提供对象的类型,但是我的问题是,如果我自己在声明类时自己进行操作,是否有危害?

这里是rule link from Sonar website。我真的不明白他们为该规则提供的示例。

  

是否存在任何性能,效率或任何其他类型的收益   将代码更改为Sonar的建议?

3 个答案:

答案 0 :(得分:7)

  

如果我在上课的时候自己动手,是否有危害?

不,这样做没有任何危害,除了在代码中添加了额外的冗长性。从相同的rule link中我们可以读到

  

Java 7引入了菱形运算符(<>),以减少   通用代码


  

是否存在任何性能,效率或任何其他类型的收益   将代码更改为Sonar的建议?

除了您(和您的团队)将使用较不冗长的代码外,不,没有


更多读数:

答案 1 :(得分:5)

更少的代码会让您感到无助和重复,并且更多的代码易于阅读和维护。

List<String> nameList = new ArrayList<String>();

List<String> nameList = new ArrayList<>();

确定差异不大。 但是,现在假设您必须更改Integer的generic:String,用第一种方法必须进行两次修改:

List<Integer> nameList = new ArrayList<Integer>();
      ^------               -------------^

真的不好。

使用钻石需要一个:

List<Integer> nameList = new ArrayList<>();
      ^---             

再举一个例子:

Map<String, List<Integer>> map = new HashMap<String, List<Integer>>();

Map<String, List<Integer>> map = new HashMap<>();

这使事情变得更清楚。
在应用程序中,通常会声明并实例化大量的集合和泛型类。重构确实很便宜。所以就做吧。

答案 2 :(得分:2)

该规则背后的全部要点是:在Java 7中,编译器能够从类型本身推断出构造函数的类型。

为什么要在构造函数中省略泛型?

2件事:

  • 指定两次类型更为冗长
  • 如果您决定更改集合,则无需两次更改通用类型。

按原样放置是否有害?并不是的。但是,最好在团队中使用一致的代码样式。因此,如果您的团队使用声纳进行代码样式检查,则为了保持一致性,应该遵循该规定。