代码之家  ›  专栏  ›  技术社区  ›  ave4496

使checkStyle需要变量前缀

  •  2
  • ave4496  · 技术社区  · 6 年前

    我希望所有复选框变量都以“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 回复  |  直到 6 年前
        1
  •  2
  •   barfuin PKV    6 年前

    我建议使用 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("");
    

    用regex检查这个并不完美,因为人们可以使用注释或子类来混淆检测器。因此,使用 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>