ModifierOrder

Description

Checks that the order of modifiers conforms to the suggestions in the Java Language specification, sections 8.1.1, 8.3.1 and 8.4.3. The correct order is:

  1. public
  2. protected
  3. private
  4. abstract
  5. static
  6. final
  7. transient
  8. volatile
  9. synchronized
  10. native
  11. strictfp

Example

To configure the check:

<module name="ModifierOrder"/>
        

Package

com.puppycrawl.tools.checkstyle.checks.modifier

Parent Module

TreeWalker

RedundantModifier

Description

Checks for redundant modifiers in:

  1. interface and annotation definitions,
  2. the final modifier on methods of final classes, and
  3. inner interface declarations that are declared as static.
  4. class constructors

Rationale: The Java Language Specification strongly discourages the usage of public and abstract for method declarations in interface definitions as a matter of style.

Interfaces by definition are abstract so the abstract modifier on the interface is redundant.

Variables 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.

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
          }
        

For non-public protected classes public modifier is not obsolete, removing public from this example will make code not compiling:

          package a;
          public class ClassWithProtectedInnerClass {
            protected class ProtectedClass {
              public ProtectedClass () {}
            }
          }

          package b;
          import a.ClassWithProtectedInnerClass;
          public class ClassExtending extends ClassWithProtectedInnerClass {
            ProtectedClass pc = new ProtectedClass();
          }
        

Properties

name description type default value
tokens tokens to check subset of tokens METHOD_DEF, VARIABLE_DEF, ANNOTATION_FIELD_DEF, INTERFACE_DEF METHOD_DEF, VARIABLE_DEF, ANNOTATION_FIELD_DEF, INTERFACE_DEF

Example

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>
        

Package

com.puppycrawl.tools.checkstyle.checks.modifier

Parent Module

TreeWalker