UnusedImports

Since Checkstyle 3.0

Description

Checks for unused import statements. An import statement is considered unused if:

  • It is not referenced in the file. The algorithm does not support wild-card imports like import java.io.*;. Most IDE's provide very sophisticated checks for imports that handle wild-card imports.
  • The class imported is from the java.lang package. For example importing java.lang.String.
  • The class imported is from the same package.
  • A static method is imported when used as method reference. In that case, only the type needs to be imported and that's enough to resolve the method.
  • Optionally: it is referenced in Javadoc comments. This check is on by default, but it is considered bad practice to introduce a compile-time dependency for documentation purposes only. As an example, the import java.util.List would be considered referenced with the Javadoc comment {@link List}. The alternative to avoid introducing a compile-time dependency would be to write the Javadoc comment as {@link java.util.List}.

The main limitation of this check is handling the cases where:

  • An imported type has the same name as a declaration, such as a member variable.
  • There are two or more static imports with the same method name (javac can distinguish imports with same name but different parameters, but checkstyle can not due to limitation.)

Properties

name description type default value since
processJavadoc Control whether to process Javadoc comments. boolean true 5.4

Examples

To configure the check:

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

Example:

// limitation as it match field name in code
import java.awt.Component; //OK

// no ability to recognize what import is not used
import static java.util.Map.copyOf; //OK
import static java.util.Arrays.copyOf; //OK

import java.lang.String; // violation

import java.util.Stack;
import java.util.Map;   // violation

import java.util.List;
import java.util.function.Function;

import static java.lang.Integer.parseInt; // violation

/**
* {@link List}
*/
class Example1{
  Stack stack = new Stack();
  private Object Component;
  int[] arr = {0,0};
  int[] array = copyOf(arr , 1);
  Function <String, Integer> stringToInteger = Integer::parseInt;
}
        

To configure the check so that it ignores the imports referenced in Javadoc comments:

<module name="Checker">
  <module name="TreeWalker">
    <module name="UnusedImports">
      <property name="processJavadoc" value="false"/>
    </module>
  </module>
</module>
        

Example:

// limitation as it match field name in code
import java.awt.Component; //OK

// no ability to recognize what import is not used
import static java.util.Map.copyOf; //OK
import static java.util.Arrays.copyOf; //OK

import java.lang.String; // violation

import java.util.Stack;
import java.util.Map;   // violation

import java.util.List; // violation
import java.util.function.Function;

import static java.lang.Integer.parseInt; // violation

/**
* {@link List}
*/
class Example2{
  Stack stack = new Stack();
  private Object Component;
  int[] arr = {0,0};
  int[] array = copyOf(arr , 1);
  Function <String, Integer> stringToInteger = Integer::parseInt;
}
        

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

Parent Module

TreeWalker