【问题标题】:Make checkstyle require variable prefix使 checkstyle 需要变量前缀
【发布时间】:2018-12-24 19:31:57
【问题描述】:

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

【问题讨论】:

  • 原始正则表达式不允许在ckx 之后的任何地方使用空格JCheckBox。如果你想在一开始就阻止它,你可能需要^.*JCheckBox\s*\((?!\s*ckx).*$。为了防止匹配(),请将其添加为前瞻:^.*JCheckBox\s*\((?!\))(?!\s*ckx).*$。如果您在字符串文字中使用它,则双重转义 \ 字符。
  • 谢谢,但还不行。我提供了一些例子。
  • 哦对不起..这是ckx
  • 也许你想要求 var 在ckx afterJCheckBox 之后开始?见^.*JCheckBox\s+ckx.*$
  • 您要配置哪种 Checkstyle 检查?

标签: regex eclipse checkstyle


【解决方案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("");

使用正则表达式检查并不完美,因为人们可以使用 cmets 或子类来混淆检测器。因此,使用PMD XPath rule 或其他东西将是一种更强大的方法,但这是另一个问题。 :-)


同样可以使用RegexpSinglelineJava 来实现,它增加了忽略 cmets 的能力,但会因意外的换行符而脱轨:

<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>

【讨论】:

  • 你能用 RegexpSingleLineJava 添加一个解决方案吗?格式化程序不允许变量声明换行:)
  • 好的,添加了一个关于 RegexpSinglelineJava 的部分。
猜你喜欢
  • 1970-01-01
  • 2011-08-05
  • 2011-09-22
  • 2012-12-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-09
  • 2013-05-14
相关资源
最近更新 更多