Как избежать предупреждения магического числа при инициализации статического поля (например, BigDecimal)? - PullRequest
0 голосов
/ 03 января 2019

У меня есть статическое поле

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

И я получаю предупреждение от CheckStyle, что 299_999L это магическое число. Как мне этого избежать - 299_999 просто долго превращается в указанный BigDecimal.

Я не нашел в документации CheckStyle подходящего решения.

EDIT : Например, когда я набираю:

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

Ответы [ 3 ]

0 голосов
/ 03 января 2019

Интересно, что вы получаете эту ошибку при объявлении статического поля. Но любой, как вы можете добавить подавление предупреждения аннотации,

@SuppressWarnings("checkstyle:magicnumber")
0 голосов
/ 03 января 2019

После вашего уточняющего комментария я могу сказать, что причина предупреждения в том, как работает проверка 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.

0 голосов
/ 03 января 2019

Вы должны объявить константу, чтобы описать немного больше того, что означает это значение:

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

Звучит избыточно, но помните, что магическое число - это любое число, используемое в коде, которое не имеет никакого объяснения его значения. Даже если у вас есть BigDecimal константа, ваше значение Long не интерпретируется как "значимое значение" для контекста.

...