MagicNumber
Since Checkstyle 3.1
Description
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);
        Properties
| 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 | 
Examples
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) {}
  }
}
Example of Usage
Violation Messages
All messages can be customized if the default message doesn't suit you. Please see the documentation to learn how to.
Package
com.puppycrawl.tools.checkstyle.checks.coding






