FinalParameters
Since Checkstyle 3.0
Description
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 , PATTERN_VARIABLE_DEF . | 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






