初始化静态字段(例如BigDecimal)时如何避免幻数警告?
How to avoid magic number warning when initialize static field (for example BigDecimal)?
我有静态字段
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)
您必须声明一个常量来描述该值的更多含义:
private static final Long MAX_AMOUNT_INITIALIZER = 299_000L;
private static final BigDecimal MAX_AMOUNT = BigDecimal.valueOf(MAX_AMOUNT_INITIALIZER);
这听起来有些多余,但请记住,幻数是代码中使用的任何数字,但对其含义没有任何解释。即使您有一个 BigDecimal
常量,您的 Long
值也不会被解释为上下文的 "meaningful value"。
有趣的是,您在声明静态字段时遇到此错误。但是任何你可以添加 suppresswarning 注释的方法,
@SuppressWarnings("checkstyle:magicnumber")
在您澄清评论之后,我可以说警告的原因在于 MagicNumber 检查的工作方式。 如果潜在的幻数在字段定义中,并且该字段是final
,那么它不标记只要所有AST 中的父标记到表示字段定义的节点都在某个列表中。
这很令人困惑,我认为对于普通用户来说,这似乎是武断的。但是静态代码分析通常是关于启发式的。
好处是你可以影响这种行为。像这样配置检查:
<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
的值是默认加DOT
加在最后。这允许更复杂的表达式。您至少需要 Checkstyle 6.11 才能工作。
我有静态字段
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)
您必须声明一个常量来描述该值的更多含义:
private static final Long MAX_AMOUNT_INITIALIZER = 299_000L;
private static final BigDecimal MAX_AMOUNT = BigDecimal.valueOf(MAX_AMOUNT_INITIALIZER);
这听起来有些多余,但请记住,幻数是代码中使用的任何数字,但对其含义没有任何解释。即使您有一个 BigDecimal
常量,您的 Long
值也不会被解释为上下文的 "meaningful value"。
有趣的是,您在声明静态字段时遇到此错误。但是任何你可以添加 suppresswarning 注释的方法,
@SuppressWarnings("checkstyle:magicnumber")
在您澄清评论之后,我可以说警告的原因在于 MagicNumber 检查的工作方式。 如果潜在的幻数在字段定义中,并且该字段是final
,那么它不标记只要所有AST 中的父标记到表示字段定义的节点都在某个列表中。
这很令人困惑,我认为对于普通用户来说,这似乎是武断的。但是静态代码分析通常是关于启发式的。
好处是你可以影响这种行为。像这样配置检查:
<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
的值是默认加DOT
加在最后。这允许更复杂的表达式。您至少需要 Checkstyle 6.11 才能工作。