java - 启用 VisibilityModifier checkstyle 模块时如何允许不可变类?

标签 java coding-style immutability verification checkstyle

我使用的 Java 代码库具有严格的 Checkstyle检查,它不喜欢以下不可变值对象:

public class Foo {
    public final int bar;
    public final String baz;

    public Foo(int bar, String baz) {
        this.bar = bar;
        this.baz = baz;
    }
}

这是因为 VisibilityModifier模块强制实例变量为 private 并具有 getter。

  1. 有没有办法让 Checkstyle 对 public final 的实例变量产生异常?

  2. 如果是这样,有没有办法让这个异常只适用于测试类?

最佳答案

我不想告诉你这个,我知道这可能不是你所希望的答案,但是:

开箱即用确实是不可能的,因为行为是硬编码在检查中的。摘自 Checkstyle source code :

if (!("private".equals(variableScope)
    || inInterfaceOrAnnotationBlock // implicitly static and final
    || (mods.contains("static") && mods.contains("final"))
    || ("package".equals(variableScope) && isPackageAllowed())
    || ("protected".equals(variableScope) && isProtectedAllowed())
    || ("public".equals(variableScope)
        && getPublicMemberRegexp().matcher(varName).find())))
{
    log(varNameAST.getLineNo(), varNameAST.getColumnNo(),
        "variable.notPrivate", varName);
}

你必须 write your own check ,可能是 VisibilityModifierCheck 的子类,它覆盖方法 visitToken() 以允许您的异常。

另一方面,如果您的类 Foo 是一个内部类,那么您也可以简单地将这些字段声明为私有(private)的,并且仍然可以从外部类访问它们。一种特殊情况,但通常是 getter 和 setter 特别烦人的情况。

关于java - 启用 VisibilityModifier checkstyle 模块时如何允许不可变类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18851452/

相关文章:

java - JAR 版本依赖冲突 - Java

java - 用于二维噪声生成的参数随机函数

python - 打开文件,读取它,处理,然后写回 - Python 中最短的方法

java - Java 中的不可变类

c++ - C++ 中可变与不可变二叉树遍历

java - 如何只用它的键定义一个 JSONObject

java - Seam/JSF 中验证失败的导航

coding-style - 链接 "and"语句时最好使用 "in"或 "let"吗?

java - 访问未覆盖的父类(super class)方法时使用 'super' 关键字

c# - 不变性和 XML 序列化