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 , BAND , BNOT , BOR , BSR , BXOR , COLON , DIV , ELIST , EQUAL , EXPR , GE , GT , LE , LITERAL_NEW , LT , METHOD_CALL , MINUS , MOD , NOT_EQUAL , PLUS , QUESTION , SL , SR , 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 in the following violations:
@Example1.Annotation(6) // violation, ''6' is a magic number.' public class Example1 { private int field = 7; // violation, ''7' is a magic number.' void method1() { int i = 1; int j = 8; // violation, ''8' is a magic number.' } public void method2() { final TestClass testObject = new TestClass(62); final int a = 3; final int[] b = {4, 5}; final int c = -3; final int d = +4; final int e = method3(10, 20); final int f = 3 * 4; final int g = 3 / 4; final int h = 3 + 4; final int i = 3 - 4; final int j = (int) 3.4; } private int method3(int a, int b) { return a + b; } public int hashCode() { return 10; // violation, ''10' is a magic number.' } @interface Annotation { int value() default 10; int[] value2() default {10}; } class TestClass { TestClass(int field) {} } }
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 in no violations:
@Example2.Annotation(6) public class Example2 { private int field = 7; void method1() { int i = 1; int j = 8; } public void method2() { final TestClass testObject = new TestClass(62); final int a = 3; final int[] b = {4, 5}; final int c = -3; final int d = +4; final int e = method3(10, 20); final int f = 3 * 4; final int g = 3 / 4; final int h = 3 + 4; final int i = 3 - 4; final int j = (int) 3.4; } private int method3(int a, int b) { return a + b; } public int hashCode() { return 10; } @interface Annotation { int value() default 10; int[] value2() default {10}; } class TestClass { TestClass(int field) {} } }
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="true"/> </module> </module> </module>
results in the following violations:
@Example3.Annotation(6) // violation, ''6' is a magic number.' public class Example3 { private int field = 7; void method1() { int i = 1; int j = 8; // violation, ''8' is a magic number.' } public void method2() { final TestClass testObject = new TestClass(62); final int a = 3; final int[] b = {4, 5}; final int c = -3; final int d = +4; final int e = method3(10, 20); final int f = 3 * 4; final int g = 3 / 4; final int h = 3 + 4; final int i = 3 - 4; final int j = (int) 3.4; } private int method3(int a, int b) { return a + b; } public int hashCode() { return 10; // violation, ''10' is a magic number.' } @interface Annotation { int value() default 10; int[] value2() default {10}; } class TestClass { TestClass(int field) {} } }
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 the following violations:
@Example4.Annotation(6) // violation, ''6' is a magic number.' public class Example4 { private int field = 7; // violation, ''7' is a magic number.' void method1() { int i = 1; int j = 8; // violation, ''8' is a magic number.' } public void method2() { final TestClass testObject = new TestClass(62); final int a = 3; final int[] b = {4, 5}; final int c = -3; final int d = +4; final int e = method3(10, 20); final int f = 3 * 4; final int g = 3 / 4; final int h = 3 + 4; final int i = 3 - 4; final int j = (int) 3.4; } private int method3(int a, int b) { return a + b; } public int hashCode() { return 10; // violation, ''10' is a magic number.' } @interface Annotation { int value() default 10; // violation, ''10' is a magic number.' int[] value2() default {10}; // violation, ''10' is a magic number.' } class TestClass { TestClass(int field) {} } }
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>
results in the following violations:
@Example5.Annotation(6) // violation, ''6' is a magic number.' public class Example5 { private int field = 7; // violation, ''7' is a magic number.' void method1() { int i = 1; int j = 8; // violation, ''8' is a magic number.' } public void method2() { final TestClass testObject = new TestClass(62); // violation above, ''62' is a magic number.' 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 = method3(10, 20); // 2 violations above: // ''10' is a magic number.' // ''20' is a magic number.' final int f = 3 * 4; // 2 violations above: // ''3' is a magic number.' // ''4' is a magic number.' final int g = 3 / 4; // ok as waiver is DIV final int h = 3 + 4; // ok as waiver is PLUS final int i = 3 - 4; // 2 violations above: // ''3' is a magic number.' // ''4' is a magic number.' final int j = (int) 3.4; //ok as waiver is TYPECAST } private int method3(int a, int b) { return a + b; } public int hashCode() { return 10; // violation, ''10' is a magic number.' } @interface Annotation { int value() default 10; int[] value2() default {10}; } class TestClass { TestClass(int field) {} } }
Config example of ignoreHashCodeMethod option:
<module name="Checker"> <module name="TreeWalker"> <module name="MagicNumber"> <property name="ignoreHashCodeMethod" value="true"/> </module> </module> </module>
results in the following violations:
@Example6.Annotation(6) // violation, ''6' is a magic number.' public class Example6 { private int field = 7; // violation, ''7' is a magic number.' void method1() { int i = 1; int j = 8; // violation, ''8' is a magic number.' } public void method2() { final TestClass testObject = new TestClass(62); final int a = 3; final int[] b = {4, 5}; final int c = -3; final int d = +4; final int e = method3(10, 20); final int f = 3 * 4; final int g = 3 / 4; final int h = 3 + 4; final int i = 3 - 4; final int j = (int) 3.4; } private int method3(int a, int b) { return a + b; } public int hashCode() { return 10; } @interface Annotation { int value() default 10; int[] value2() default {10}; } class TestClass { TestClass(int field) {} } }
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