Since Checkstyle 3.1
Checks that there are no "magic numbers" where a magic number is a numeric literal that is not defined as a constant. By default, -1, 0, 1, and 2 are not considered to be magic numbers.
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