避免在用幻数填充对象时出现checkstyle MagicNumber错误



我在类成员初始化中使用幻数:

private static final RangeMap<Integer, String> MY_MAP = new ImmutableRangeMap.Builder<Integer, String>()
.put(Range.closed(10, 31), "random string 1")
.put(Range.closed(32, 36), "random string 2")
.put(Range.closed(37, 39), "random string 3")
.put(Range.closed(40, 78), "random string 4")
// lot of similar lines here
.build();

代码非常清晰易读,但checkstyle给了我们大量关于checkstyle的警告。我可以抑制警告,但我正在寻找更好的Java解决方案。

一种方法是使用constanst,代码如下所示:

private static final Integer RANDOM_STRING_1_START = 10;
private static final Integer RANDOM_STRING_2_START = 32;
private static final Integer RANDOM_STRING_3_START = 37;
private static final Integer RANDOM_STRING_4_START = 40;
private static final Integer RANDOM_STRING_1_END = 31;
private static final Integer RANDOM_STRING_2_END = 36;
private static final Integer RANDOM_STRING_3_END = 39;
private static final Integer RANDOM_STRING_4_END = 78;
private static final RangeMap<Integer, String> MY_MAP = new ImmutableRangeMap.Builder<Integer, String>()
.put(Range.closed(RANDOM_STRING_1_START, RANDOM_STRING_1_END), "random string 1")
.put(Range.closed(RANDOM_STRING_2_START, RANDOM_STRING_2_END), "random string 2")
.put(Range.closed(RANDOM_STRING_3_START, RANDOM_STRING_3_END), "random string 3")
.put(Range.closed(RANDOM_STRING_4_START, RANDOM_STRING_4_END), "random string 4")
// lot of similar lines here
.build();

我觉得它不像以前那么好看可读了。此外,它在打字时更容易出错。

有什么想法可以在不抱怨checkstyle的情况下定义值表吗?我不想压制警告,我想找到";Java方式";。

正如评论中所说,您提到的规则在这里没有意义。把它想象成一个助手/提醒:想象一下,你必须在一个类中使用两次或三次超时,并分配值";60〃;到各个地方。它有助于保持这些数字的同步。

对于您的情况,以下是一些您可以尝试的方法。

常规文件名排除

如果它是一个只存在一次的类,您可以在您的checkstyle-config:中使用此排除

<module name="BeforeExecutionExclusionFileFilter">
<property name="fileNamePattern" value="MyClass.java$" />
</module>

但我宁愿只将其用于module-info.java。

抑制筛选器

此筛选器更具体,因为它只会抑制特定的检查。

<module name="SuppressionSingleFilter">
<property name="checks" value="MagicNumber" />
<property name="files"
value="(JpaSomethingFactory|MyModelSomethingFactory).java" />
</module>

使用注释抑制一系列行

您可以使用此代码段仅在注释部分的范围内抑制此警告。在您的情况下,我推荐这种方法,因为它是最容易维护的,以防文件名更改,或者您不再需要它。

<!-- allow switching off some checks -->
<module name="SuppressionCommentFilter">
<property name="offCommentFormat" value="CHECKSTYLE.OFF: ([w|]+)" />
<property name="onCommentFormat" value="CHECKSTYLE.ON: ([w|]+)" />
<property name="checkFormat" value="$1" />
</module>

这样使用:

// CHECKSTYLE:OFF: MagicNumber - Specific test class
private static final RangeMap<Integer, String> MY_MAP = new ImmutableRangeMap.Builder<Integer, String>()
.put(Range.closed(10, 31), "random string 1")
.put(Range.closed(32, 36), "random string 2")
.put(Range.closed(37, 39), "random string 3")
.put(Range.closed(40, 78), "random string 4")
// lot of similar lines here
.build();
// CHECKSTYLE:ON: MagicNumber - Specific test class

相关内容

  • 没有找到相关文章

最新更新