Class MagicNumberCheck
- java.lang.Object
-
- com.puppycrawl.tools.checkstyle.api.AutomaticBean
-
- com.puppycrawl.tools.checkstyle.api.AbstractViolationReporter
-
- com.puppycrawl.tools.checkstyle.api.AbstractCheck
-
- com.puppycrawl.tools.checkstyle.checks.coding.MagicNumberCheck
-
- All Implemented Interfaces:
Configurable,Contextualizable
public class MagicNumberCheck extends AbstractCheck
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);
-
Property
ignoreNumbers- Specify non-magic numbers. Type isdouble[]. Default value is-1, 0, 1, 2. -
Property
ignoreHashCodeMethod- Ignore magic numbers in hashCode methods. Type isboolean. Default value isfalse. -
Property
ignoreAnnotation- Ignore magic numbers in annotation declarations. Type isboolean. Default value isfalse. -
Property
ignoreFieldDeclaration- Ignore magic numbers in field declarations. Type isboolean. Default value isfalse. -
Property
ignoreAnnotationElementDefaults- Ignore magic numbers in annotation elements defaults. Type isboolean. Default value istrue. -
Property
constantWaiverParentToken- Specify tokens that are allowed in the AST path from the number literal to the enclosing constant definition. Type isjava.lang.String[]. Validation type istokenTypesSet. Default value is TYPECAST, METHOD_CALL, EXPR, ARRAY_INIT, UNARY_MINUS, UNARY_PLUS, ELIST, STAR, ASSIGN, PLUS, MINUS, DIV, LITERAL_NEW. -
Property
tokens- tokens to check Type isjava.lang.String[]. Validation type istokenSet. Default value is: NUM_DOUBLE, NUM_FLOAT, NUM_INT, NUM_LONG.
To configure the check with default configuration:
<module name="MagicNumber"/>
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="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>
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="MagicNumber"> <property name="ignoreFieldDeclaration" value="false"/> </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="MagicNumber"> <property name="ignoreAnnotationElementDefaults" value="false"/> </module>
results in following violations:
@interface anno { int value() default 10; // violation int[] value2() default {10}; // violation }Config example of constantWaiverParentToken option:
<module name="MagicNumber"> <property name="constantWaiverParentToken" value="ASSIGN,ARRAY_INIT,EXPR, UNARY_PLUS, UNARY_MINUS, TYPECAST, ELIST, DIV, PLUS "/> </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="MagicNumber"> <property name="ignoreHashCodeMethod" value="true"/> </module>
result is no violation:
class TestHashCode { public int hashCode() { return 10; // OK } }Parent is
com.puppycrawl.tools.checkstyle.TreeWalkerViolation Message Keys:
-
magic.number
- Since:
- 3.1
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class com.puppycrawl.tools.checkstyle.api.AutomaticBean
AutomaticBean.OutputStreamOptions
-
-
Field Summary
Fields Modifier and Type Field Description static java.lang.StringMSG_KEYA key is pointing to the warning message text in "messages.properties" file.
-
Constructor Summary
Constructors Constructor Description MagicNumberCheck()Constructor for MagicNumber Check.
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description int[]getAcceptableTokens()The configurable token set.int[]getDefaultTokens()Returns the default token a check is interested in.int[]getRequiredTokens()The tokens that this check must be registered for.voidsetConstantWaiverParentToken(java.lang.String... tokens)Setter to specify tokens that are allowed in the AST path from the number literal to the enclosing constant definition.voidsetIgnoreAnnotation(boolean ignoreAnnotation)Setter to ignore magic numbers in annotation declarations.voidsetIgnoreAnnotationElementDefaults(boolean ignoreAnnotationElementDefaults)Setter to ignore magic numbers in annotation elements defaults.voidsetIgnoreFieldDeclaration(boolean ignoreFieldDeclaration)Setter to ignore magic numbers in field declarations.voidsetIgnoreHashCodeMethod(boolean ignoreHashCodeMethod)Setter to ignore magic numbers in hashCode methods.voidsetIgnoreNumbers(double... list)Setter to specify non-magic numbers.voidvisitToken(DetailAST ast)Called to process a token.-
Methods inherited from class com.puppycrawl.tools.checkstyle.api.AbstractCheck
beginTree, clearMessages, destroy, finishTree, getFileContents, getLine, getLines, getMessages, getTabWidth, getTokenNames, init, isCommentNodesRequired, leaveToken, log, log, log, setFileContents, setTabWidth, setTokens
-
Methods inherited from class com.puppycrawl.tools.checkstyle.api.AbstractViolationReporter
finishLocalSetup, getCustomMessages, getId, getMessageBundle, getSeverity, getSeverityLevel, setId, setSeverity
-
Methods inherited from class com.puppycrawl.tools.checkstyle.api.AutomaticBean
configure, contextualize, getConfiguration, setupChild
-
-
-
-
Field Detail
-
MSG_KEY
public static final java.lang.String MSG_KEY
A key is pointing to the warning message text in "messages.properties" file.- See Also:
- Constant Field Values
-
-
Method Detail
-
getDefaultTokens
public int[] getDefaultTokens()
Description copied from class:AbstractCheckReturns the default token a check is interested in. Only used if the configuration for a check does not define the tokens.- Specified by:
getDefaultTokensin classAbstractCheck- Returns:
- the default tokens
- See Also:
TokenTypes
-
getAcceptableTokens
public int[] getAcceptableTokens()
Description copied from class:AbstractCheckThe configurable token set. Used to protect Checks against malicious users who specify an unacceptable token set in the configuration file. The default implementation returns the check's default tokens.- Specified by:
getAcceptableTokensin classAbstractCheck- Returns:
- the token set this check is designed for.
- See Also:
TokenTypes
-
getRequiredTokens
public int[] getRequiredTokens()
Description copied from class:AbstractCheckThe tokens that this check must be registered for.- Specified by:
getRequiredTokensin classAbstractCheck- Returns:
- the token set this must be registered for.
- See Also:
TokenTypes
-
visitToken
public void visitToken(DetailAST ast)
Description copied from class:AbstractCheckCalled to process a token.- Overrides:
visitTokenin classAbstractCheck- Parameters:
ast- the token to process
-
setConstantWaiverParentToken
public void setConstantWaiverParentToken(java.lang.String... tokens)
Setter to specify tokens that are allowed in the AST path from the number literal to the enclosing constant definition.- Parameters:
tokens- The string representation of the tokens interested in
-
setIgnoreNumbers
public void setIgnoreNumbers(double... list)
Setter to specify non-magic numbers.- Parameters:
list- list of numbers to ignore.
-
setIgnoreHashCodeMethod
public void setIgnoreHashCodeMethod(boolean ignoreHashCodeMethod)
Setter to ignore magic numbers in hashCode methods.- Parameters:
ignoreHashCodeMethod- decide whether to ignore hash code methods
-
setIgnoreAnnotation
public void setIgnoreAnnotation(boolean ignoreAnnotation)
Setter to ignore magic numbers in annotation declarations.- Parameters:
ignoreAnnotation- decide whether to ignore annotations
-
setIgnoreFieldDeclaration
public void setIgnoreFieldDeclaration(boolean ignoreFieldDeclaration)
Setter to ignore magic numbers in field declarations.- Parameters:
ignoreFieldDeclaration- decide whether to ignore magic numbers in field declaration
-
setIgnoreAnnotationElementDefaults
public void setIgnoreAnnotationElementDefaults(boolean ignoreAnnotationElementDefaults)
Setter to ignore magic numbers in annotation elements defaults.- Parameters:
ignoreAnnotationElementDefaults- decide whether to ignore annotation elements defaults
-
-