Class RedundantModifierCheck
- All Implemented Interfaces:
Configurable
,Contextualizable
Checks for redundant modifiers.
Rationale: The Java Language Specification strongly discourages the usage
of public
and abstract
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.
-
Inner
interface
declarations that are declared asstatic
. - Class constructors.
-
Nested
enum
definitions that are declared asstatic
.
Interfaces by definition are abstract so the abstract
modifier on the interface is redundant.
Classes inside of interfaces by definition are public and static,
so the public
and static
modifiers
on the inner classes 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.
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
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.
To configure the check:
<module name="RedundantModifier"/>
To configure the check to check only methods and not variables:
<module name="RedundantModifier"> <property name="tokens" value="METHOD_DEF"/> </module>
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.api.AutomaticBean
AutomaticBean.OutputStreamOptions
-
Field Summary
FieldsModifier and TypeFieldDescriptionstatic final String
A key is pointing to the warning message text in "messages.properties" file.private static final int[]
An array of tokens for interface modifiers. -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate void
checkClassConstructorModifiers
(DetailAST classCtorAst) Check if class constructor has proper modifiers.private void
Check if enum constructor has proper modifiers.private void
checkEnumDef
(DetailAST ast) Checks whether enum has proper modifiers.private void
checkForRedundantModifier
(DetailAST ast, int modifierType) Checks if given ast has a redundant modifier.private void
Checks if interface has proper modifiers.int[]
The configurable token set.int[]
Returns the default token a check is interested in.getMethodAnnotationsList
(DetailAST methodDef) Gets the list of annotations on method definition.int[]
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
Checks if current AST node is member of Interface or Annotation, not of their subnodes.private void
Process validation of parameters for Methods with no definition.private void
Do validation of interface of annotation.private void
processMethods
(DetailAST ast) Process validation of Methods.private void
Checks if given resource has redundant modifiers.void
visitToken
(DetailAST ast) Called to process a token.Methods inherited from class com.puppycrawl.tools.checkstyle.api.AbstractCheck
beginTree, clearViolations, destroy, finishTree, getFileContents, 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.api.AutomaticBean
configure, contextualize, getConfiguration, setupChild
-
Field Details
-
MSG_KEY
A key is pointing to the warning message text in "messages.properties" file.- See Also:
-
TOKENS_FOR_INTERFACE_MODIFIERS
private static final int[] TOKENS_FOR_INTERFACE_MODIFIERSAn array of tokens for interface modifiers.
-
-
Constructor Details
-
RedundantModifierCheck
public RedundantModifierCheck()
-
-
Method Details
-
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:
-
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:
-
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:
-
visitToken
Description copied from class:AbstractCheck
Called to process a token.- Overrides:
visitToken
in classAbstractCheck
- Parameters:
ast
- the token to process
-
checkInterfaceModifiers
Checks if interface has proper modifiers.- Parameters:
ast
- interface to check
-
checkEnumConstructorModifiers
Check if enum constructor has proper modifiers.- Parameters:
ast
- constructor of enum
-
checkEnumDef
Checks whether enum has proper modifiers.- Parameters:
ast
- enum definition.
-
processInterfaceOrAnnotation
Do validation of interface of annotation.- Parameters:
ast
- token AST
-
processMethods
Process validation of Methods.- Parameters:
ast
- method AST
-
processAbstractMethodParameters
Process validation of parameters for Methods with no definition.- Parameters:
ast
- method AST
-
checkClassConstructorModifiers
Check if class constructor has proper modifiers.- Parameters:
classCtorAst
- class constructor ast
-
processResources
Checks if given resource has redundant modifiers.- Parameters:
ast
- ast
-
checkForRedundantModifier
Checks if given ast has a redundant modifier.- Parameters:
ast
- astmodifierType
- The modifier to check for.
-
isClassProtected
Checks if given class ast has protected modifier.- Parameters:
classDef
- class ast- Returns:
- true if class is protected, false otherwise
-
isClassPublic
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
Checks if current AST node is member of Enum.- Parameters:
ast
- AST node- Returns:
- true if it is an enum member
-
isInterfaceOrAnnotationMember
Checks if current AST node is member of Interface or Annotation, not of their subnodes.- Parameters:
ast
- AST node- Returns:
- true or false
-
isAnnotatedWithSafeVarargs
Checks if method definition is annotated with. SafeVarargs annotation- Parameters:
methodDef
- method definition node- Returns:
- true or false
-
getMethodAnnotationsList
Gets the list of annotations on method definition.- Parameters:
methodDef
- method definition node- Returns:
- List of annotations
-