Since Checkstyle 3.0
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.
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 |
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++; } } }
All messages can be customized if the default message doesn't suit you. Please see the documentation to learn how to.
com.puppycrawl.tools.checkstyle.checks