Since Checkstyle 3.1
Constant definition is any variable/field that has 'final' modifier. It is fine to have one constant defining multiple numeric literals within one expression:
static final int SECONDS_PER_DAY = 24 * 60 * 60; static final double SPECIAL_RATIO = 4.0 / 3.0; static final double SPECIAL_SUM = 1 + Math.E; static final double SPECIAL_DIFFERENCE = 4 - Math.PI; static final Border STANDARD_BORDER = BorderFactory.createEmptyBorder(3, 3, 3, 3); static final Integer ANSWER_TO_THE_ULTIMATE_QUESTION_OF_LIFE = new Integer(42);
name | description | type | default value | since |
---|---|---|---|---|
constantWaiverParentToken | Specify tokens that are allowed in the AST path from the number literal to the enclosing constant definition. | subset of tokens TokenTypes | ARRAY_INIT , ASSIGN , DIV , ELIST , EXPR , LITERAL_NEW , METHOD_CALL , MINUS , PLUS , STAR , TYPECAST , UNARY_MINUS , UNARY_PLUS | 6.11 |
ignoreAnnotation | Ignore magic numbers in annotation declarations. | boolean | false |
5.4 |
ignoreAnnotationElementDefaults | Ignore magic numbers in annotation elements defaults. | boolean | true |
8.23 |
ignoreFieldDeclaration | Ignore magic numbers in field declarations. | boolean | false |
6.6 |
ignoreHashCodeMethod | Ignore magic numbers in hashCode methods. | boolean | false |
5.3 |
ignoreNumbers | Specify non-magic numbers. | double[] | -1, 0, 1, 2 |
3.1 |
tokens | tokens to check | subset of tokens NUM_DOUBLE , NUM_FLOAT , NUM_INT , NUM_LONG . | NUM_DOUBLE , NUM_FLOAT , NUM_INT , NUM_LONG . | 3.1 |
To configure the check with default configuration:
<module name="Checker"> <module name="TreeWalker"> <module name="MagicNumber"/> </module> </module>
results is following violations:
@MyAnnotation(6) // violation class MyClass { private field = 7; // violation void foo() { int i = i + 1; // no violation int j = j + 8; // violation } public int hashCode() { return 10; // violation } } @interface anno { int value() default 10; // no violation }
To configure the check so that it checks floating-point numbers that are not 0, 0.5, or 1:
<module name="Checker"> <module name="TreeWalker"> <module name="MagicNumber"> <property name="tokens" value="NUM_DOUBLE, NUM_FLOAT"/> <property name="ignoreNumbers" value="0, 0.5, 1"/> <property name="ignoreFieldDeclaration" value="true"/> <property name="ignoreAnnotation" value="true"/> </module> </module> </module>
results is following violations:
@MyAnnotation(6) // no violation class MyClass { private field = 7; // no violation void foo() { int i = i + 1; // no violation int j = j + 8; // violation } }
To configure the check so that it ignores magic numbers in field declarations:
<module name="Checker"> <module name="TreeWalker"> <module name="MagicNumber"> <property name="ignoreFieldDeclaration" value="false"/> </module> </module> </module>
results in the following violations:
public record MyRecord() { private static int myInt = 7; // ok, field declaration void foo() { int i = myInt + 1; // no violation, 1 is defined as non-magic int j = myInt + 8; // violation } }
To configure the check to check annotation element defaults:
<module name="Checker"> <module name="TreeWalker"> <module name="MagicNumber"> <property name="ignoreAnnotationElementDefaults" value="false"/> </module> </module> </module>
results in following violations:
@interface anno { int value() default 10; // violation int[] value2() default {10}; // violation }
Config example of constantWaiverParentToken option:
<module name="Checker"> <module name="TreeWalker"> <module name="MagicNumber"> <property name="constantWaiverParentToken" value="ASSIGN,ARRAY_INIT,EXPR, UNARY_PLUS, UNARY_MINUS, TYPECAST, ELIST, DIV, PLUS "/> </module> </module> </module>
result is following violation:
class TestMethodCall { public void method2() { final TestMethodCall dummyObject = new TestMethodCall(62); //violation final int a = 3; // ok as waiver is ASSIGN final int [] b = {4, 5} // ok as waiver is ARRAY_INIT final int c = -3; // ok as waiver is UNARY_MINUS final int d = +4; // ok as waiver is UNARY_PLUS final int e = method(1, 2) // ELIST is there but violation due to METHOD_CALL final int x = 3 * 4; // violation final int y = 3 / 4; // ok as waiver is DIV final int z = 3 + 4; // ok as waiver is PLUS final int w = 3 - 4; // violation final int x = (int)(3.4); //ok as waiver is TYPECAST } }
Config example of ignoreHashCodeMethod option:
<module name="Checker"> <module name="TreeWalker"> <module name="MagicNumber"> <property name="ignoreHashCodeMethod" value="true"/> </module> </module> </module>
result is no violation:
class TestHashCode { public int hashCode() { return 10; // OK } }
All messages can be customized if the default message doesn't suit you. Please see the documentation to learn how to.
com.puppycrawl.tools.checkstyle.checks.coding