Class RedundantModifierCheck
- java.lang.Object
-
- com.puppycrawl.tools.checkstyle.AbstractAutomaticBean
-
- com.puppycrawl.tools.checkstyle.api.AbstractViolationReporter
-
- com.puppycrawl.tools.checkstyle.api.AbstractCheck
-
- com.puppycrawl.tools.checkstyle.checks.modifier.RedundantModifierCheck
-
- All Implemented Interfaces:
Configurable
,Contextualizable
public class RedundantModifierCheck extends AbstractCheck
Checks for redundant modifiers.Rationale: The Java Language Specification strongly discourages the usage of
public
andabstract
for method declarations in interface definitions as a matter of style.The check validates:
- Interface and annotation definitions.
- Final modifier on methods of final and anonymous classes.
-
Type declarations nested under interfaces that are declared as
public
orstatic
. - Class constructors.
-
Nested
enum
definitions that are declared asstatic
. -
record
definitions that are declared asfinal
and nestedrecord
definitions that are declared asstatic
. -
strictfp
modifier when using JDK 17 or later. See reason at JEP 306 -
final
modifier on unnamed variables when using JDK 22 or later.
interfaces by definition are abstract so the
abstract
modifier is redundant on them.Type declarations nested under interfaces by definition are public and static, so the
public
andstatic
modifiers on nested type declarations are redundant. On the other hand, classes inside of interfaces can be abstract or non abstract. So,abstract
modifier is allowed.Fields in interfaces and annotations are automatically public, static and final, so these modifiers are redundant as well.
As annotations are a form of interface, their fields are also automatically public, static and final just as their annotation fields are automatically public and abstract.
A record class is implicitly final and cannot be abstract, these restrictions emphasize that the API of a record class is defined solely by its state description, and cannot be enhanced later by another class. Nested records are implicitly static. This avoids an immediately enclosing instance which would silently add state to the record class. See JEP 395 for more info.
Enums by definition are static implicit subclasses of java.lang.Enum<E>. So, the
static
modifier on the enums is redundant. In addition, if enum is inside of interface,public
modifier is also redundant.Enums can also contain abstract methods and methods which can be overridden by the declared enumeration fields. See the following example:
public enum EnumClass { FIELD_1, FIELD_2 { @Override public final void method1() {} // violation expected }; public void method1() {} public final void method2() {} // no violation expected }
Since these methods can be overridden in these situations, the final methods are not marked as redundant even though they can't be extended by other classes/enums.
Nested
enum
types are always static by default.Final classes by definition cannot be extended so the
final
modifier on the method of a final class is redundant.Public modifier for constructors in non-public non-protected classes is always obsolete:
public class PublicClass { public PublicClass() {} // OK } class PackagePrivateClass { public PackagePrivateClass() {} // violation expected }
There is no violation in the following example, because removing public modifier from ProtectedInnerClass constructor will make this code not compiling:
package a; public class ClassExample { protected class ProtectedInnerClass { public ProtectedInnerClass () {} } } package b; import a.ClassExample; public class ClassExtending extends ClassExample { ProtectedInnerClass pc = new ProtectedInnerClass(); }
-
Property
jdkVersion
- Set the JDK version that you are using. Old JDK version numbering is supported (e.g. 1.8 for Java 8) as well as just the major JDK version alone (e.g. 8) is supported. This property only considers features from officially released Java versions as supported. Features introduced in preview releases are not considered supported until they are included in a non-preview release. Type isjava.lang.String
. Default value is"22"
. -
Property
tokens
- tokens to check Type isjava.lang.String[]
. Validation type istokenSet
. Default value is: METHOD_DEF, VARIABLE_DEF, ANNOTATION_FIELD_DEF, INTERFACE_DEF, CTOR_DEF, CLASS_DEF, ENUM_DEF, RESOURCE, ANNOTATION_DEF, RECORD_DEF, PATTERN_VARIABLE_DEF, LITERAL_CATCH, LAMBDA.
Parent is
com.puppycrawl.tools.checkstyle.TreeWalker
Violation Message Keys:
-
redundantModifier
- Since:
- 3.0
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class com.puppycrawl.tools.checkstyle.AbstractAutomaticBean
AbstractAutomaticBean.OutputStreamOptions
-
-
Field Summary
Fields Modifier and Type Field Description private static int
JDK_17
Constant for jdk 17 version number.private static int
JDK_22
Constant for jdk 22 version number.private int
jdkVersion
Set the JDK version that you are using.static String
MSG_KEY
A key is pointing to the warning message text in "messages.properties" file.private static int[]
TOKENS_FOR_INTERFACE_MODIFIERS
An array of tokens for interface modifiers.
-
Constructor Summary
Constructors Constructor Description RedundantModifierCheck()
-
Method Summary
All Methods Static Methods Instance Methods Concrete Methods Modifier and Type Method Description private void
checkClassConstructorModifiers(DetailAST classCtorAst)
Check if class constructor has proper modifiers.private void
checkConstructorModifiers(DetailAST ctorDefAst)
Check modifiers of constructor.private void
checkEnumConstructorModifiers(DetailAST ast)
Check if enum constructor has proper modifiers.private void
checkForRedundantModifier(DetailAST ast, int... modifierTypes)
Checks if given ast has a redundant modifier.private void
checkInterfaceModifiers(DetailAST ast)
Checks if interface has proper modifiers.private void
checkUnnamedVariables(DetailAST ast)
Check if the variable is unnamed and has redundant final modifier.int[]
getAcceptableTokens()
The configurable token set.int[]
getDefaultTokens()
Returns the default token a check is interested in.private static List<DetailAST>
getMethodAnnotationsList(DetailAST methodDef)
Gets the list of annotations on method definition.int[]
getRequiredTokens()
The tokens that this check must be registered for.private static boolean
isAnnotatedWithSafeVarargs(DetailAST methodDef)
Checks if method definition is annotated with.private static boolean
isClassProtected(DetailAST classDef)
Checks if given class ast has protected modifier.private static boolean
isClassPublic(DetailAST ast)
Checks if given class is accessible from "public" scope.private static boolean
isEnumMember(DetailAST ast)
Checks if current AST node is member of Enum.private static boolean
isInterfaceOrAnnotationMember(DetailAST ast)
Checks if current AST node is member of Interface or Annotation, not of their subnodes.private static boolean
isUnnamedVariable(DetailAST ast)
Check if the variable is unnamed.private void
processAbstractMethodParameters(DetailAST ast)
Process validation of parameters for Methods with no definition.private void
processInterfaceOrAnnotation(DetailAST ast)
Do validation of interface of annotation.private void
processLambdaParameters(DetailAST lambdaAst)
Process lambda parameters.private void
processMethods(DetailAST ast)
Process validation of Methods.private void
processResources(DetailAST ast)
Checks if given resource has redundant modifiers.void
setJdkVersion(String jdkVersion)
Setter to set the JDK version that you are using.void
visitToken(DetailAST ast)
Called to process a token.-
Methods inherited from class com.puppycrawl.tools.checkstyle.api.AbstractCheck
beginTree, clearViolations, destroy, finishTree, getFileContents, getFilePath, getLine, getLineCodePoints, getLines, getTabWidth, getTokenNames, getViolations, 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.AbstractAutomaticBean
configure, contextualize, getConfiguration, setupChild
-
-
-
-
Field Detail
-
MSG_KEY
public static final String MSG_KEY
A key is pointing to the warning message text in "messages.properties" file.- See Also:
- Constant Field Values
-
TOKENS_FOR_INTERFACE_MODIFIERS
private static final int[] TOKENS_FOR_INTERFACE_MODIFIERS
An array of tokens for interface modifiers.
-
JDK_22
private static final int JDK_22
Constant for jdk 22 version number.- See Also:
- Constant Field Values
-
JDK_17
private static final int JDK_17
Constant for jdk 17 version number.- See Also:
- Constant Field Values
-
jdkVersion
private int jdkVersion
Set the JDK version that you are using. Old JDK version numbering is supported (e.g. 1.8 for Java 8) as well as just the major JDK version alone (e.g. 8) is supported. This property only considers features from officially released Java versions as supported. Features introduced in preview releases are not considered supported until they are included in a non-preview release.
-
-
Constructor Detail
-
RedundantModifierCheck
public RedundantModifierCheck()
-
-
Method Detail
-
setJdkVersion
public void setJdkVersion(String jdkVersion)
Setter to set the JDK version that you are using. Old JDK version numbering is supported (e.g. 1.8 for Java 8) as well as just the major JDK version alone (e.g. 8) is supported. This property only considers features from officially released Java versions as supported. Features introduced in preview releases are not considered supported until they are included in a non-preview release.- Parameters:
jdkVersion
- the Java version- Since:
- 10.18.0
-
getDefaultTokens
public int[] getDefaultTokens()
Description copied from class:AbstractCheck
Returns the default token a check is interested in. Only used if the configuration for a check does not define the tokens.- Specified by:
getDefaultTokens
in classAbstractCheck
- Returns:
- the default tokens
- See Also:
TokenTypes
-
getRequiredTokens
public int[] getRequiredTokens()
Description copied from class:AbstractCheck
The tokens that this check must be registered for.- Specified by:
getRequiredTokens
in classAbstractCheck
- Returns:
- the token set this must be registered for.
- See Also:
TokenTypes
-
getAcceptableTokens
public int[] getAcceptableTokens()
Description copied from class:AbstractCheck
The 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:
getAcceptableTokens
in classAbstractCheck
- Returns:
- the token set this check is designed for.
- See Also:
TokenTypes
-
visitToken
public void visitToken(DetailAST ast)
Description copied from class:AbstractCheck
Called to process a token.- Overrides:
visitToken
in classAbstractCheck
- Parameters:
ast
- the token to process
-
processLambdaParameters
private void processLambdaParameters(DetailAST lambdaAst)
Process lambda parameters.- Parameters:
lambdaAst
- node of typeTokenTypes.LAMBDA
-
checkUnnamedVariables
private void checkUnnamedVariables(DetailAST ast)
Check if the variable is unnamed and has redundant final modifier.- Parameters:
ast
- node of typeTokenTypes.VARIABLE_DEF
orTokenTypes.PATTERN_VARIABLE_DEF
orTokenTypes.PARAMETER_DEF
-
isUnnamedVariable
private static boolean isUnnamedVariable(DetailAST ast)
Check if the variable is unnamed.- Parameters:
ast
- node of typeTokenTypes.VARIABLE_DEF
orTokenTypes.PATTERN_VARIABLE_DEF
orTokenTypes.PARAMETER_DEF
- Returns:
- true if the variable is unnamed
-
checkConstructorModifiers
private void checkConstructorModifiers(DetailAST ctorDefAst)
Check modifiers of constructor.- Parameters:
ctorDefAst
- ast node of typeTokenTypes.CTOR_DEF
-
checkInterfaceModifiers
private void checkInterfaceModifiers(DetailAST ast)
Checks if interface has proper modifiers.- Parameters:
ast
- interface to check
-
checkEnumConstructorModifiers
private void checkEnumConstructorModifiers(DetailAST ast)
Check if enum constructor has proper modifiers.- Parameters:
ast
- constructor of enum
-
processInterfaceOrAnnotation
private void processInterfaceOrAnnotation(DetailAST ast)
Do validation of interface of annotation.- Parameters:
ast
- token AST
-
processMethods
private void processMethods(DetailAST ast)
Process validation of Methods.- Parameters:
ast
- method AST
-
processAbstractMethodParameters
private void processAbstractMethodParameters(DetailAST ast)
Process validation of parameters for Methods with no definition.- Parameters:
ast
- method AST
-
checkClassConstructorModifiers
private void checkClassConstructorModifiers(DetailAST classCtorAst)
Check if class constructor has proper modifiers.- Parameters:
classCtorAst
- class constructor ast
-
processResources
private void processResources(DetailAST ast)
Checks if given resource has redundant modifiers.- Parameters:
ast
- ast
-
checkForRedundantModifier
private void checkForRedundantModifier(DetailAST ast, int... modifierTypes)
Checks if given ast has a redundant modifier.- Parameters:
ast
- astmodifierTypes
- The modifiers to check for.
-
isClassProtected
private static boolean isClassProtected(DetailAST classDef)
Checks if given class ast has protected modifier.- Parameters:
classDef
- class ast- Returns:
- true if class is protected, false otherwise
-
isClassPublic
private static boolean isClassPublic(DetailAST ast)
Checks if given class is accessible from "public" scope.- Parameters:
ast
- class def to check- Returns:
- true if class is accessible from public scope,false otherwise
-
isEnumMember
private static boolean isEnumMember(DetailAST ast)
Checks if current AST node is member of Enum.- Parameters:
ast
- AST node- Returns:
- true if it is an enum member
-
isInterfaceOrAnnotationMember
private static boolean isInterfaceOrAnnotationMember(DetailAST ast)
Checks if current AST node is member of Interface or Annotation, not of their subnodes.- Parameters:
ast
- AST node- Returns:
- true or false
-
isAnnotatedWithSafeVarargs
private static boolean isAnnotatedWithSafeVarargs(DetailAST methodDef)
Checks if method definition is annotated with. SafeVarargs annotation- Parameters:
methodDef
- method definition node- Returns:
- true or false
-
getMethodAnnotationsList
private static List<DetailAST> getMethodAnnotationsList(DetailAST methodDef)
Gets the list of annotations on method definition.- Parameters:
methodDef
- method definition node- Returns:
- List of annotations
-
-