确保具有特定注释的字段为“私有”

时间:2015-11-11 21:29:44

标签: java intellij-idea static-analysis checkstyle pmd

我们的代码中常见的错误是编写

@Mock Object object;
@InjectMocks Subject subject;

而不是

@Mock private Object object;
@InjectMocks private Subject subject;

这可以防止PMD / FindBugs / IntelliJ在字段变为未使用时发出警告,并且我们的代码审查也会因“使此字段为私有”注释而膨胀。

当具有特定注释的字段没有预期的可见性时,是否有任何静态分析规则在任何工具中发出警告?

我找到了Checkstyle的VisibilityModifier,但它标记了所有非私有字段,而不仅仅是具有特定注释的字段。

2 个答案:

答案 0 :(得分:2)

您可以在IntelliJ IDEA中使用结构搜索检查。例如,使用这样的模式:

@Mock @Modifier("packageLocal") $FieldType$ $FieldName$ = $Init$;

FieldType:min:1,max:1
FieldName:min:1,max:1
Init:min:0,max:1

答案 1 :(得分:1)

您可以使用PMD的Rule Designer创建新的XPath规则,该规则可以嵌入到PMD规则集xml文件中。我还没有将IntelliD用于IntelliJ IDEA或Jenkins,但我确定插件存在。

这是我制定的规则(未在规则设计师之外进行测试):

<rule  name="NonPrivateMockAnnotation"
  message="Mock anotation should be private"
  class="net.sourceforge.pmd.lang.rule.XPathRule">
  <description>
  </description>
  <properties>
    <property name="xpath">
    <value>
<![CDATA[
//ClassOrInterfaceBodyDeclaration[
    Annotation/MarkerAnnotation/Name[
        @Image = 'InjectMocks' or
        @Image = 'Mock' 
    ] and
    FieldDeclaration/@Private = 'false'
]
]]>
    </value>
    </property>
  </properties>
  <priority>3</priority>
  <example>
<![CDATA[
class Example {
  @Mock Object object;
  @InjectMocks Subject subject;
}
]]>
  </example>
</rule>