Java 当VisibilityModifier checkstyle模块启用时,如何允许不可变类?
我使用具有严格检查的Java代码库,它不喜欢以下不可变值对象:Java 当VisibilityModifier checkstyle模块启用时,如何允许不可变类?,java,coding-style,immutability,verification,checkstyle,Java,Coding Style,Immutability,Verification,Checkstyle,我使用具有严格检查的Java代码库,它不喜欢以下不可变值对象: public class Foo { public final int bar; public final String baz; public Foo(int bar, String baz) { this.bar = bar; this.baz = baz; } } 这是因为模块强制实例变量为private,并具有getter 是否有办法使Checkstyle对
public class Foo {
public final int bar;
public final String baz;
public Foo(int bar, String baz) {
this.bar = bar;
this.baz = baz;
}
}
这是因为模块强制实例变量为private
,并具有getter
公共final
的实例变量例外我不想告诉你,我知道这可能不是你所希望的答案,但是: 这确实是不可能开箱即用的,因为行为是在检查中硬编码的。摘自Checkstyle:
if(!(“private”.equals(variableScope)
||inInterfaceOrAnnotationBlock//隐式静态和最终
||(模块包含(“静态”)和模块包含(“最终”))
||(“package.equals(variableScope)&&isPackageAllowed())
||(“protected”.equals(variableScope)&&isProtectedAllowed())
||(“公共”。等于(可变范围)
&&getPublicMemberRegexp().matcher(varName.find())
{
日志(varNameAST.getLineNo(),varNameAST.getColumnNo(),
“variable.notPrivate”,varName);
}
您可能需要作为VisibilityModifierCheck
的子类,该类重写方法visitToken()
,以允许您的异常
另一方面,如果您的类
Foo
是一个内部类,那么您也可以简单地将字段声明为private,并仍然从外部类访问它们。这是一种特殊情况,但通常情况下,getter和setter特别令人讨厌。最终成员可以是公开的,这是有道理的。如果我是你,我会尝试联系Checkstyle开发人员并询问他们,也许他们会在下一个版本中更改它,或者至少添加一个属性。这与你要求的不完全一样,但是你可以在每个类上面添加//Checkstyle\u OFF:Visibility
,这样可以让Checkstyle停止抱怨。我不知道有哪种设置可以有条件地应用该规则。我通常认为您不希望这样。即使字段是最终字段,您仍然会公开对象的内部结构,这将永远限制您未来的重构选项。但这是另一种讨论。:-)@托马斯:这是一个常见的误解,是的:)