Checkstyle 建议不可能的常量排序

问题描述 投票:0回答:3

我有几个共享公共片段的长字符串常量(

static final
变量)。该片段本身没有任何意义,因此我将其声明为“私有静态最终”。

例如:

private static final XML_H = "<?xml ....";
public static final DOC_1 = XML_H + "<tag....";
public static final DOC_2 = XML_H + "<tag....";

现在我收到来自 checkstyle 的警告

Variable access definition in wrong order

来自声明顺序检查规则,该规则规定私人应该在公共之后。

如果我将

XML_H
移动到“应该”的位置,代码将无法编译,因为在声明字段之前无法引用该字段。

对我来说,这似乎是规则中的一个错误,因为这是真正的语言限制,并且没有其他方法可以做到这一点。我认为规则应该将这种情况排除在检查之外。

你们同意吗?或者有什么方法可以改进代码而不出现问题?

java checkstyle
3个回答
3
投票

您是对的,DeclarationOrder 检查不涵盖您的案件。

这是对此检查的合理限制,因为 Checkstyle 仅适用于源代码,因此没有可用的编译器信息。因此,虽然可以处理您的特定情况,但类似的其他情况会导致运行时类型解析和范围界定问题。换句话说,我并不真的期望他们增强 Checkstyle 工具。

为了解决这个问题,您可以将检查的

ignoreModifiers
选项设置为
true
,这将告诉 Checkstyle 忽略您的情况,同时仍然检查方法和构造函数是否位于字段之后。这应该是合理的。

如果你无法改变规则(即通过公司限制)并且无法说服负责人,那么你可以将私有常量移至

private static
内部类。这也会使违规行为消失,但当然它会让你的代码变得更糟。 (这真的很难过。)


3
投票

与其说这是规则中的错误,不如说是规则的限制。只需使用这些问题中涵盖的技术来抑制警告即可:

您无法轻易更改该代码。你不想为了取悦检查风格而做一些黑客行为。


0
投票

对类或受影响的常量进行注释效果很好:

@SuppressWarnings(value = "DeclarationOrder")

其中

DeclarationOrder
是 checkstyle 模块名称

© www.soinside.com 2019 - 2024. All rights reserved.