FinalParameters

Since Checkstyle 3.0

Description

Checks that parameters for methods, constructors, catch and for-each blocks are final. Interface, abstract, and native methods are not checked: the final keyword does not make sense for interface, abstract, and native method parameters as there is no code that could modify the parameter.

Rationale: Changing the value of parameters during the execution of the method's algorithm can be confusing and should be avoided. A great way to let the Java compiler prevent this coding style is to declare parameters final.

Properties

name description type default value since
ignorePrimitiveTypes Ignore primitive types as parameters. boolean false 6.2
ignoreUnnamedParameters Ignore unnamed parameters. boolean true 10.18.0
tokens tokens to check subset of tokens METHOD_DEF , CTOR_DEF , LITERAL_CATCH , FOR_EACH_CLAUSE . METHOD_DEF , CTOR_DEF . 3.0

Examples

To configure the check to enforce final parameters for methods and constructors:

<module name="Checker">
  <module name="TreeWalker">
    <module name="FinalParameters"/>
  </module>
</module>
        

Example:

public class Example1 {
  public Example1() { }
  public Example1(final int m) { }
  public Example1(final int m, int n) { } // violation, 'n should be final'
  public void methodOne(final int x) { }
  public void methodTwo(int x) { } // violation, 'x should be final'
  public static void main(String[] args) { } // violation, 'args should be final'
}
        

To configure the check to enforce final parameters only for constructors:

<module name="Checker">
  <module name="TreeWalker">
    <module name="FinalParameters">
      <property name="tokens" value="CTOR_DEF"/>
    </module>
  </module>
</module>
        

Example:

public class Example2 {
  public Example2() { }
  public Example2(final int m) { }
  public Example2(final int m, int n) { } // violation, 'n should be final'
  public void methodOne(final int x) { }
  public void methodTwo(int x) { }
  public static void main(String[] args) { }
}
        

To configure the check to allow ignoring primitive datatypes as parameters:

<module name="Checker">
  <module name="TreeWalker">
    <module name="FinalParameters">
      <property name="ignorePrimitiveTypes" value="true"/>
    </module>
  </module>
</module>
        

Example:

public class Example3 {
  public Example3() { }
  public Example3(final int m) { }
  public Example3(final int m, int n) { }
  public void methodOne(final int x) { }
  public void methodTwo(int x) { }
  public static void main(String[] args) { } // violation, 'args should be final'
}
        

To configure the check to enforce final parameters for catch and for-each blocks while ignoring unnamed parameters:

<module name="Checker">
  <module name="TreeWalker">
    <module name="FinalParameters">
      <property name="tokens" value="FOR_EACH_CLAUSE, LITERAL_CATCH"/>
      <property name="ignoreUnnamedParameters" value="true"/>
    </module>
  </module>
</module>
        

Example:

public class Example4 {

  void testCatchParameters() {
    try {
      int x = 1 / 0;
    }
    catch (Exception e) { // violation, 'Parameter e should be final'
      System.out.println(e);
    }
    try {
      int x = 1 / 0;
    }
    catch (Exception _) { // ok, unnamed catch parameter, it is implicitly final
      System.out.println("infinity");
    }
    try {
      int x = 1 / 0;
    }
    // it is ok to have unnamed final parameters
    // but it is unnecessary as it is implicitly final
    catch (final Exception _) {
      System.out.println("infinity");
    }
  }

  void testForEachParameters() {
    int[] l = {1, 2, 3};
    int x = 0;
    for (int number: l) { // violation, 'Parameter number should be final'
      System.out.println(number);
    }
    // ok, unnamed enhanced for loop variable, it is implicitly final
    for (int _: l) {
      x++;
    }
  }

}
        

Example of Usage

Violation Messages

All messages can be customized if the default message doesn't suit you. Please see the documentation to learn how to.

Package

com.puppycrawl.tools.checkstyle.checks

Parent Module

TreeWalker