使Checkstyle要求使用变量前缀

时间:2018-07-17 07:29:25

标签: regex eclipse checkstyle

我希望所有复选框变量都以“ ckx”开头。

^.*JCheckBox((?! ckx).)*$

这适用于变量声明,但也匹配定义。 例如。

ckxSomeCheckbox = new JCheckBox();

有什么主意如何防止将此代码显示为错误?

有效示例:

private JCheckBox ckxTest = new JCheckBox();
public javax.swing.JCheckBox ckxTest;

无效的示例:

private JCheckBox abcTest;
private JCheckBox abcckxTest;
ckxTest = new JCheckBox();
ckxTest = new JCheckBox("");

1 个答案:

答案 0 :(得分:1)

我建议使用RegexpMultiline检查,以便您发现有人在不方便的地方将换行符插入代码的情况。

正则表达式为\bJCheckBox\b\s*(?!ckx[A-Z])\w+explanation / examples)。

<module name="RegexpMultiline">
  <property name="format" value="\bJCheckBox\b\s*(?!ckx[A-Z])\w+"/>
  <property name="message" value="Missing prefix 'ckx' on checkbox variable"/>
  <property name="fileExtensions" value="java"/>
</module>

请注意,我删除了错误标识符位于行开头的行,因为这些行将无法编译。除非您早先声明了变量,否则在这种情况下,将标记为问题所在。

ckxTest = new JCheckBox(); 
ckxTest = new JCheckBox("");

使用正则表达式进行检查并不完美,因为人们可以使用注释或子类来混淆检测器。因此,使用PMD XPath rule之类的方法会更强大,但这是另一个问题。 :-)


使用RegexpSinglelineJava可以达到相同的效果,该功能增加了忽略注释的功能,但会因意外的换行符而出轨:

<module name="RegexpSinglelineJava">
  <property name="format" value="\bJCheckBox\b\s*(?!ckx[A-Z])\w+"/>
  <property name="message" value="Missing prefix 'ckx' on checkbox variable"/>
  <property name="ignoreComments" value="true"/>
</module>