如何使用Checkstyle强制执行某些方法的静态导入?

4
如何使用checkstyle强制要求某些方法只能通过静态导入进行调用?
例如,我希望以下方法只能通过静态导入来使用:
import static java.util.Objects.isNull;
import static java.util.Objects.nonNull;

因此,像这样的代码是不被允许的:

if (Objects.nonNull(varName)) {

有什么方法可以使用(最好是)标准或非标准工具来实现这一点吗?

1
你将如何处理来自不同类的同名方法的使用? - Bohemian
5
您可以在CheckStyle、FindBugs或PMD中实现自定义规则。但是,大多数Java程序员(以及大多数编码风格指南)认为使用静态导入这种方式是不好的编码风格。 - Stephen C
1
@StephenC 我个人更喜欢静态导入,因为它使代码更易读(特别是Collectors等),但绝不会考虑强制使用它。 - Bohemian
1
@Bohemian - 嗯...风格规范正在演变。 - Stephen C
1
@nikopol86 - 嗯,我怀疑你不会找到一个标准规则来做这件事。至少因为你只想强制执行这两个指定的方法。那是一个非常“特殊情况”或“本地”规则。 - Stephen C
显示剩余6条评论
2个回答

4
您可以禁止导入对象的字符串:
<module name="RegexpSinglelineJava">
    <!-- Please statically import methods -->
    <property name="format" value="import java.util.Objects;"/>
</module>

0
请注意!永远不要使用静态导入来调用 Objects.isNull / Objects.nonNull... 这并不是因为静态导入有问题,而是因为使用 isNull() / nonNull() 代替 == null / != null 是错误的。在 Java 中,我们在 Objects.isNull / Objects.nonNull 方法出现之前就已经使用这些运算符了20年,而且没有理由改变这种做法。使用 isNull() / notNull() 只会引入不一致的风格,并混淆本地静态分析工具。它们并不比自从第一天就存在的语言特性更清晰。
请阅读 JavaDoc - 这些方法有相当特定的目的,而不是用来替换或竞争(不)相等运算符: API Note: 此方法存在是为了作为 Predicate 使用,例如: filter(Objects::isNull)
关于原始问题 - 目前在Checkstyle(以及我所知道的任何其他Java静态分析工具)中没有强制使用特定方法的静态导入的方法。只有禁止是可能的。我真的希望能够同时做到这两点,因为我自己发现静态导入非常有用,并且在许多情况下提供更好的代码清晰度(以及滥用的来源,例如上述示例中尝试导入过于模糊的名称,如ofofNullable)。
但目前您只能为此创建自己的Checkstyle插件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接