These checks address miscellaneous problems.
The LocationReference check helps in cases where the name of the current method or class must be used as an argument to a method call or as initial value of a declared variable. It compares the actual argument to the current method or class name, and flags it if a mismatch is detected.
LogManager.getLogger
. This property or variableNames
must be set for
this check to do anything.
none (check is disabled)method
. If a variable of one of the names specified by this property is declared anywhere,
and its initial value is a String
or Class
literal, that literal is checked. This
property or methodCalls
must be set for this check to do anything.
none (check is disabled)method
, the value is
expected to be the exact name of the current method, or <init>
in constructors, and
<clinit>
in static initializers.
method
-1
being the last argument
in the list.
0
The following example checks that the current method name is passed as the first argument to certain log methods, or given as a String literal in initializations of variables named method
:
In the next example, the getLogger
method takes the current class as its first argument. The class shall be specified as a simple class object (e.g. MyClass.class
). Just getClass()
would not work. Calls where the argument is not a class object are ignored. Note the optional custom message, which allows tailoring the violation text to the particular use case:
The PropertyCatalog check helps to keep a property file in sync with a piece of code that contains the property keys. That piece of code is called the “property catalog”, and may be:
The property catalog and the properties file are expected to be connected to each other either by a configurable naming convention.
The property catalog code could look like this (other forms are possible, see below):
The constructor arguments of the enum constants are the keys to the property file, which in turn looks like this:
In this example, the property with key one
is orphaned, because it is not referenced by the property catalog. It would be flagged along with the duplicate reference to two
.
In a property catalog, the enum constants themselves may also be used as keys:
The property catalog can also consist of normal constants. Private constants are ignored.
Important: The keys in a property catalog must be simple literals of type String
, int
,
long
, or boolean
. No arithmetic allowed, no method calls, no references to other constants.
Just simple literals. Remember that Checkstyle works on source code.
The check roughly works like this:
selection
are checked.excludedFields
are ignored.propertyFile
, the corresponding property file is located.If the property catalog is a class or interface, the values of the defined constants are the property keys. If the property catalog is an enum, you can choose whether the enum constant itself shall be the key, or the first parameter passed to the enum constant’s constructor (via enumArgument
). In a class, private constants are never considered.
This check find duplicate keys in the Java code, but not in the property file. Use UniqueProperties for that. It also does not help keep the translations of your property files in sync (e.g. file.properties, file_de.properties, file_fr.properties, etc.). Use Translation for that, and configure this check only for one of the property files.
$
signs, for example
com.foo.Outer$Inner
.
^(?!x)x
(check is disabled)excludedFields
is applied to the name of the constant, not the key. With the
exception of an enum constant used as key, constant and key are two separate things (see examples above).
serialVersionUID
false
), or
the first argument of the enum constant's constructor (true
). When the property catalog is not an
enum, then this property is ignored.
false
.
baseDir
. In this template, the following placeholders may be
used (examples are for com.foo.Bar$Inner
):
{0}
com.foo.Bar$Inner
){1}
com/foo/Bar/Inner
){2}
com.foo.Bar
){3}
com/foo/Bar
){4}
..
's (../../..
){5}
com/foo
){6}
Bar
){7}
Inner
){8}
baseDir
on the path to the message catalog (subdir1
). This placeholder, as well as {9}
and {10}
are useful if your project being analyzed consists of submodules.{9}
subdir2
){10}
subdir3
)UTF-8
true
true
true
, the property keys are treated as case sensitive; if false
,
case is ignored.
true
In the following example, it is assumed that you have a naming convention which requires all property catalogs to have a type name that ends in Catalog
. The corresponding property file is assumed to share the name of the Java file and reside in the same package, but under src/main/resources:
The above example is for Eclipse, where ${workspace_loc}
may be used to refer to the file system location of the current workspace. For SonarQube, you may use relative file paths. For the other environments, you may define a custom module property, which you dynamically set to the project directory. Example for Gradle: