VariableDeclarationUsageDistance
Since Checkstyle 5.8
Description
Properties
name | description | type | default value | since |
---|---|---|---|---|
allowedDistance | Specify the maximum distance between a variable's declaration and its first usage. Value should be greater than 0. | int | 3 |
5.8 |
ignoreFinal | Allow to ignore variables with a 'final' modifier. | boolean | true |
5.8 |
ignoreVariablePattern | Define RegExp to ignore distance calculation for variables listed in this pattern. | Pattern | "" |
5.8 |
validateBetweenScopes | Allow to calculate the distance between a variable's declaration and its first usage across different scopes. | boolean | false |
5.8 |
Examples
To configure the check with default config:
<module name="Checker">
<module name="TreeWalker">
<module name="VariableDeclarationUsageDistance"/>
</module>
</module>
Example:
public class Example1 {
public void foo1() {
// violation below, 'variable 'num' declaration and its first usage is 4.'
int num;
final double PI; // ok, final variables not checked
System.out.println("Statement 1");
System.out.println("Statement 2");
System.out.println("Statement 3");
num = 1;
PI = 3.14;
}
public void foo2() {
int a; // ok, used in different scope
int b; // ok, used in different scope
int count = 0; // ok, used in different scope
{
System.out.println("Inside inner scope");
a = 1;
b = 2;
count++;
}
}
}
Check is able to detect a block of initialization methods, as a single point for distance. If a variable is used in such a block and there are no other statements after variable declaration, then distance = 1.
Configure the check to default:
<module name="Checker">
<module name="TreeWalker">
<module name="VariableDeclarationUsageDistance"/>
</module>
</module>
Example:
public class Example2 {
public void case1(long timeNow, int hh, int min) {
int minutes = min + 5; // ok, No violation reported
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timeNow);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.HOUR_OF_DAY, hh);
cal.set(Calendar.MINUTE, minutes);
}
public void case2(long timeNow, int hh, int min){
// violation below, 'variable 'minutes' declaration and its first usage is 6.'
int minutes = min + 5000;
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(timeNow);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.HOUR_OF_DAY, hh);
System.out.println("Hello World");
cal.set(Calendar.MINUTE, minutes);
}
}
The distance for the variable "minutes" in the method case1
is 1 even
though this variable is used in the fifth method's call.
The distance for the variable "minutes" in the method case2
is 6
because there is one more expression (except the initialization block) between the
declaration of this variable and its usage.
To configure the check to set allowed distance:
<module name="Checker">
<module name="TreeWalker">
<module name="VariableDeclarationUsageDistance">
<property name="allowedDistance" value="4"/>
</module>
</module>
</module>
Example:
public class Example3 {
public void foo1() {
int num; // ok, distance = 4
final double PI; // ok, final variables not checked
System.out.println("Statement 1");
System.out.println("Statement 2");
System.out.println("Statement 3");
num = 1;
PI = 3.14;
}
public void foo2() {
int a; // ok, used in different scope
int b; // ok, used in different scope
int count = 0; // ok, used in different scope
{
System.out.println("Inside inner scope");
a = 1;
b = 2;
count++;
}
}
}
To configure the check to ignore certain variables:
<module name="Checker">
<module name="TreeWalker">
<module name="VariableDeclarationUsageDistance">
<property name="ignoreVariablePattern" value="^num$"/>
</module>
</module>
</module>
This configuration ignores variables named "num".
Example:
public class Example4 {
public void foo1() {
int num; // ok, variable ignored
final double PI; // ok, final variables not checked
System.out.println("Statement 1");
System.out.println("Statement 2");
System.out.println("Statement 3");
num = 1;
PI = 3.14;
}
public void foo2() {
int a; // ok, used in different scope
int b; // ok, used in different scope
int count = 0; // ok, used in different scope
{
System.out.println("Inside inner scope");
a = 1;
b = 2;
count++;
}
}
}
To configure the check to force validation between scopes:
<module name="Checker">
<module name="TreeWalker">
<module name="VariableDeclarationUsageDistance">
<property name="validateBetweenScopes" value="true"/>
</module>
</module>
</module>
Example:
public class Example5 {
public void foo1() {
// violation below, 'variable 'num' declaration and its first usage is 4.'
int num;
final double PI; // ok, final variables not checked
System.out.println("Statement 1");
System.out.println("Statement 2");
System.out.println("Statement 3");
num = 1;
PI = 3.14;
}
public void foo2() {
int a; // ok, distance = 2
int b; // ok, distance = 3
// violation below, 'variable 'count' declaration and its first usage is 4.'
int count = 0;
{
System.out.println("Inside inner scope");
a = 1;
b = 2;
count++;
}
}
}
To configure the check to check final variables:
<module name="Checker">
<module name="TreeWalker">
<module name="VariableDeclarationUsageDistance">
<property name="ignoreFinal" value="false"/>
</module>
</module>
</module>
Example:
public class Example6 {
public void foo1() {
// violation below, 'variable 'num' declaration and its first usage is 4.'
int num;
// violation below, 'variable 'PI' declaration and its first usage is 5.'
final double PI;
System.out.println("Statement 1");
System.out.println("Statement 2");
System.out.println("Statement 3");
num = 1;
PI = 3.14;
}
public void foo2() {
int a; // ok, used in different scope
int b; // ok, used in different scope
int count = 0; // ok, used in different scope
{
System.out.println("Inside inner scope");
a = 1;
b = 2;
count++;
}
}
}
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.coding