Class RedundantModifierCheck

  • All Implemented Interfaces:
    Configurable, Contextualizable

    public class RedundantModifierCheck
    extends AbstractCheck
    Checks for redundant modifiers in interface and annotation definitions, final modifier on methods of final classes, inner interface declarations that are declared as static, non public class constructors and enum constructors, nested enum definitions that are declared as static.

    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.

    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();
     }
     
    • 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
      • TOKENS_FOR_INTERFACE_MODIFIERS

        private static final int[] TOKENS_FOR_INTERFACE_MODIFIERS
        An array of tokens for interface modifiers.
    • Constructor Detail

      • RedundantModifierCheck

        public RedundantModifierCheck()
    • Method Detail

      • 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 class AbstractCheck
        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 class AbstractCheck
        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 class AbstractCheck
        Returns:
        the token set this check is designed for.
        See Also:
        TokenTypes
      • 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
      • checkEnumDef

        private void checkEnumDef​(DetailAST ast)
        Checks whether enum has proper modifiers.
        Parameters:
        ast - enum definition.
      • 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 modifierType)
        Checks if given ast has a redundant modifier.
        Parameters:
        ast - ast
        modifierType - The modifier 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 java.util.List<DetailAST> getMethodAnnotationsList​(DetailAST methodDef)
        Gets the list of annotations on method definition.
        Parameters:
        methodDef - method definition node
        Returns:
        List of annotations