【问题标题】:Sonar rule - Reorder the modifiers for interface default methods声纳规则 - 重新排序接口默认方法的修饰符
【发布时间】:2014-09-02 23:43:21
【问题描述】:

我刚开始使用 Sonar,我有一个使用 JDK 8 的项目。到目前为止,我遇到的唯一问题是:

Reorder the modifiers to comply with the Java Language Specification.

这发生在我在接口中的默认方法上,比如

default boolean isValid([params here]) { 
  /*method body here*/
}

我知道这确实是一个小问题,但我不想禁用任何规则,那么您如何解决它?

非常感谢!

附言我在谷歌上没有找到任何东西,我知道这条规则的含义(我已经阅读了它的描述),但我不知道如何处理默认关键字。

更新:看起来像个bug,我已经在这里报告了,https://jira.codehaus.org/browse/SONARJAVA-590 更新 2:似乎已经修复,将在 2.4 版本中提供。

【问题讨论】:

  • 您使用的是什么版本的声纳?你确定它支持 Java 8?
  • 我正在使用 Sonar 4.3.2 和 Java 插件 2.3。我还在使用适用于 Sonar 的 Maven 插件(相同版本 2.3)运行覆盖范围。所以是的,我确定支持 Java 8。
  • 不管你怎么说,我怀疑你可能正在处理一个不支持 Java 8 的版本。否则,这不仅是一个错误,而且完全是一派胡言。 Java Language Specification没有修饰符的顺序。它们可以按任何顺序出现。
  • JLS sec 8.4.3 推荐类的方法修饰符的特定(“习惯”)顺序,但违反此顺序并非错误。类和接口的字段声明也有类似的子句,但奇怪的是接口方法修饰符没有。我想声明一个接口方法strictfp default而不是default strictfp可能被认为是不好的风格,尽管这很愚蠢。不过,这显然是 Sonar 检查的类型。
  • 是的,但我只有默认修饰符,所以 8.4.3 秒对我没有影响。不过谢谢指出,我不知道。

标签: java java-8 sonarqube rule


【解决方案1】:

接口的方法声明语法包含在JLS, section 9.4中。

简而言之,方法修饰符必须位于方法标头之前,其中包括方法的返回类型。你的声明有一个方法修饰符default,它的返回类型是boolean,所以除了

default boolean isValid(/*parameters*/) { /*body*/ }

因此我认为这一定是 Sonar 中的一个错误。

【讨论】:

  • 感谢您的回答,我会接受它,因为这似乎是唯一合乎逻辑的解释。我也报告了这个错误,请参阅更新后的问题 :)
  • @SilviuBurcea 太好了,感谢您提交声纳错误。
【解决方案2】:

您好,感谢您的反馈。

您可以查看检查的源代码:ModifiersOrderCheck(链接到最后一次提交在撰写本文时)

您会看到 default 修饰符没有被检查,因为自从 sonar-java-plugin 支持 Java 8 以来,该规则没有更新。

所以这确实是一个错误,但它必须在 java 插件项目上报告,而不是在 Mojo 的声纳 maven 插件上。我创建了正确的票:https://jira.codehaus.org/browse/SONARJAVA-590 请随意投票。

【讨论】:

  • 我无权提交 SONARJAVA 项目中的错误。很抱歉。
  • 没问题!糟糕的报告总比没有报告好:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-24
  • 1970-01-01
  • 2010-12-05
  • 2018-12-19
  • 2011-04-13
  • 1970-01-01
相关资源
最近更新 更多