Class ClassMemberImpliedModifierCheck

  • All Implemented Interfaces:
    Configurable, Contextualizable

    public class ClassMemberImpliedModifierCheck
    extends AbstractCheck

    Checks for implicit modifiers on nested types in classes and records.

    This check is effectively the opposite of RedundantModifier. It checks the modifiers on nested types in classes and records, ensuring that certain modifiers are explicitly specified even though they are actually redundant.

    Nested enums, interfaces, and records within a class are always static and as such the compiler does not require the static modifier. This check provides the ability to enforce that the static modifier is explicitly coded and not implicitly added by the compiler.

     public final class Person {
       enum Age {  // violation
         CHILD, ADULT
       }
     }
     

    Rationale for this check: Nested enums, interfaces, and records are treated differently from nested classes as they are only allowed to be static. Developers should not need to remember this rule, and this check provides the means to enforce that the modifier is coded explicitly.

    • Property violateImpliedStaticOnNestedEnum - Control whether to enforce that static is explicitly coded on nested enums in classes and records. Type is boolean. Default value is true.
    • Property violateImpliedStaticOnNestedInterface - Control whether to enforce that static is explicitly coded on nested interfaces in classes and records. Type is boolean. Default value is true.
    • Property violateImpliedStaticOnNestedRecord - Control whether to enforce that static is explicitly coded on nested records in classes and records. Type is boolean. Default value is true.

    To configure the check so that it checks that all implicit modifiers on nested interfaces, enums, and records are explicitly specified in classes and records.

    Configuration:

     <module name="ClassMemberImpliedModifier" />
     

    Code:

     public final class Person {
       static interface Address1 {  // valid
       }
    
       interface Address2 {  // violation
       }
    
       static enum Age1 {  // valid
         CHILD, ADULT
       }
    
       enum Age2 {  // violation
         CHILD, ADULT
       }
    
       public static record GoodRecord() {} // valid
       public record BadRecord() {} // violation
    
       public static record OuterRecord() {
         static record InnerRecord1(){} // valid
         record InnerRecord2(){} // violation
       }
     }
     

    Parent is com.puppycrawl.tools.checkstyle.TreeWalker

    Violation Message Keys:

    • class.implied.modifier
    Since:
    8.16
    • Method Detail

      • setViolateImpliedStaticOnNestedEnum

        public void setViolateImpliedStaticOnNestedEnum​(boolean violateImplied)
        Setter to control whether to enforce that static is explicitly coded on nested enums in classes and records.
        Parameters:
        violateImplied - True to perform the check, false to turn the check off.
      • setViolateImpliedStaticOnNestedInterface

        public void setViolateImpliedStaticOnNestedInterface​(boolean violateImplied)
        Setter to control whether to enforce that static is explicitly coded on nested interfaces in classes and records.
        Parameters:
        violateImplied - True to perform the check, false to turn the check off.
      • setViolateImpliedStaticOnNestedRecord

        public void setViolateImpliedStaticOnNestedRecord​(boolean violateImplied)
        Setter to control whether to enforce that static is explicitly coded on nested records in classes and records.
        Parameters:
        violateImplied - True to perform the check, false to turn the check off.
      • 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
      • isInTypeBlock

        private static boolean isInTypeBlock​(DetailAST ast)
        Checks if ast is in a class, enum, or record block.
        Parameters:
        ast - the current ast
        Returns:
        true if ast is in a class, enum, or record