Checkstyle 不允许特定的枚举常量

Checkstyle disallow specific enum constant

有没有办法使用 checkstyle 来禁止使用特定的枚举值(除了试图用正则表达式捕获它)?

我想阻止使用 javax.persistence.CascadeType.ALL,但似乎只能找到阻止使用整个 javax.persistence.CascadeType 枚举的选项。

这不是那么容易,但有一些方法(或解决方法?)

  1. 您可以使用 MatchXPathCheck 报告任何使用 CascadeType.ALL 的违规行为。配置看起来像
<!-- under TreeWalker -->
<module name="MatchXpath">
    <property name="query" value="//DOT[count(./IDENT) = 2 and ./*[1][@text = 'CascadeType'] and ./*[2][@text = 'ALL']]"/>
    <message key="matchxpath.match"
             value="Do not use Cascade.ALL"/>
</module>

它将报告对 CascadeType.ALL 的任何使用的违规行为,不包括进口。但如果你直接使用静态导入和常量,它将不起作用,例如

import static javax.persistence.CascadeType.ALL;

Object a = ALL; // we wont catch it
  1. 其他方式是其他xpath,但禁止使用ALL
<!-- under TreeWalker -->
<module name="MatchXpath">
    <property name="query" value="//IDENT[@text = 'ALL']"/>
    <message key="matchxpath.match"
        value="Do not use CascadeType.ALL"/>
</module>

这将捕获所有用法(也包括导入),但如果您有一些其他名为 ALL 的常量,则可能会产生误报,因为这里我们没有指定其类型。

  1. 要禁止静态导入,您可以使用IllegalImportCheck。它将报告
  2. 等案例的违规行为
import static javax.persistence.CascadeType.ALL;

但如果有 star import,它将无法工作。

您也可以尝试组合这些方法或创建更好的 xpath,因为以上只是一个草图。