初始化静态字段(例如BigDecimal)时如何避免幻数警告?

时间:2019-01-03 01:27:20

标签: java initialization field bigdecimal checkstyle

我有静态字段

private static final BigDecimal MAX_AMOUNT = BigDecimal.valueOf(299_999L);

我从CheckStyle收到警告,299_999L是幻数。 如何避免这种情况-299_999只是长时间转换为指定的BigDecimal

我在CheckStyle文档中找不到任何合适的解决方案。

编辑: 例如,当我输入时就会显示出来:

private static final BigDecimal MAX_AMOUNT = BigDecimal.valueOf(299_999L).setScale(4, BigDecimal.ROUND_HALF-EVEN)

3 个答案:

答案 0 :(得分:1)

有趣的是,您在声明静态字段时遇到此错误。但是无论如何添加抑制警告注释,

@SuppressWarnings("checkstyle:magicnumber")

答案 1 :(得分:0)

您必须声明一个常数以描述该值的含义:

private static final Long MAX_AMOUNT_INITIALIZER = 299_000L;
private static final BigDecimal MAX_AMOUNT = BigDecimal.valueOf(MAX_AMOUNT_INITIALIZER);

这听起来很多余,但请记住,幻数是代码中使用的任何数字,没有任何含义。即使您有一个BigDecimal常量,您的Long值也不会被解释为上下文的“有意义的值”。

答案 2 :(得分:0)

在您发表评论后,我可以说警告的原因是 MagicNumber 检查的方式。 如果潜在的幻数在字段定义中,并且该字段为final,则只要AST中的所有父标记都标记为 not 表示字段定义的节点位于某个列表中。

这很令人困惑,我认为对于普通用户来说,这似乎是任意的。但是静态代码分析通常是关于启发式的。

好消息是您可以影响此行为。像这样配置检查:

<module name="MagicNumber">
    <property name="constantWaiverParentToken"
        value="TYPECAST, METHOD_CALL, EXPR, ARRAY_INIT, UNARY_MINUS, UNARY_PLUS, ELIST, STAR, ASSIGN, PLUS, MINUS, DIV, LITERAL_NEW, DOT"/>
</module>

constantWaiverParentToken的值是添加到末尾的默认 plus DOT。这允许更复杂的表达式。您至少需要Checkstyle 6.11才能起作用。