因此我的文件中包含以下代码行
List<String> nameList = new ArrayList<String>();
现在,每次我运行声纳扫描时,上面一行都会显示一个错误,提示我应该使用菱形运算符。现在我知道从Java7编译器会自动检测并为ArrayList提供对象的类型,但是我的问题是,如果我自己在声明类时自己进行操作,是否有危害?
这里是rule link from Sonar website。我真的不明白他们为该规则提供的示例。
是否存在任何性能,效率或任何其他类型的收益 将代码更改为Sonar的建议?
答案 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件事:
按原样放置是否有害?并不是的。但是,最好在团队中使用一致的代码样式。因此,如果您的团队使用声纳进行代码样式检查,则为了保持一致性,应该遵循该规定。