【问题标题】:Sonar complaining "The diamond operator ("<>") should be used"声纳抱怨“应该使用菱形运算符(“<>”)”
【发布时间】:2019-02-06 15:41:17
【问题描述】:

所以我的文件中有以下代码行

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

现在每次我运行声纳扫描时,它都会在上面的行中显示一个错误,说我应该改用菱形运算符。现在我明白了,Java7 编译器会自动检测并提供 ArrayList 的对象类型,但我的问题是,如果我在声明类时自己这样做会有害处吗?

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

是否有任何性能、效率或任何其他类型的增益? 将代码更改为 Sonar 的建议?

【问题讨论】:

  • 你只是在浪费按键。这是唯一的性能问题。
  • 对此不应有硬性规定。但是有人可能会争辩说,如果具体类型会被重复(您只需更改类型),菱形运算符会更容易维护。
  • 我认为它对性能或其他方面没有任何影响,它只是一个较短的声明。请注意,严重性设置为次要,因此无需担心。
  • 还要注意泛型只存在于源代码中,而不存在于字节码中,这意味着它与性能和效率无关。

标签: java sonarqube sonarqube-scan


【解决方案1】:

更少的无用和重复的代码,更多的代码是可读和可维护的。

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

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

好吧,差别不大。

但假设现在你必须将泛型:String 更改为 Integer,第一种方式你必须做两个修改:

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<>();

它让事情变得更清晰。

在应用程序中,您通常会声明和实例化大量的集合和泛型类。重构它真的很便宜。所以就去做吧。

【讨论】:

  • 在旧代码库中是否有一些代码重构工具/实用程序可以替换所有此类事件? IDE 有什么帮助吗?
【解决方案2】:

如果我自己在声明类时这样做有什么害处吗?

不,这样做没有任何害处,除了代码中增加了额外的冗长。从同一个rule link我们可以读到

Java 7 引入了菱形运算符 () 以减少 泛型代码


是否有任何性能、效率或任何其他类型的增益? 将代码更改为 Sonar 的建议?

除了您(和您的团队)的代码不那么冗长之外,不,没有


进一步阅读:

【讨论】:

  • 我遇到了一个模糊的情况,其中一个字段在方法中被初始化。因此,除非您去查看现场声明,否则钻石专业化应该是什么并不明显。有人可能会争辩说,初始化一个字段应该在声明附近完成,但这不是重点
【解决方案3】:

这条规则背后的重点是:在 java 7 中,编译器能够从类型本身推断构造函数的类型。

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

两件事:

  • 两次指定类型更冗长
  • 如果您决定更改集合,则不需要两次更改泛型的类型。

让它保持原样有害吗?并不真地。但在您的团队中拥有一致的代码风格总是更好。因此,如果您的团队使用声纳进行代码样式检查,您应该遵守它以保持一致性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-22
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 2017-01-13
    • 2022-01-12
    • 2015-03-23
    相关资源
    最近更新 更多