我有静态字段
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)
答案 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才能起作用。