使 checkstyle 需要变量前缀

Make checkstyle require variable prefix

我希望所有复选框变量都以 "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("");

我建议使用 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>