282 lines
9.4 KiB
XML
282 lines
9.4 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
|
|
|
<document xmlns="http://maven.apache.org/XDOC/2.0"
|
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
xsi:schemaLocation="http://maven.apache.org/XDOC/2.0 http://maven.apache.org/xsd/xdoc-2.0.xsd">
|
|
|
|
<head>
|
|
<title>Modifiers</title>
|
|
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"/>
|
|
<script type="text/javascript" src="js/anchors.js"/>
|
|
<script type="text/javascript" src="js/google-analytics.js"/>
|
|
<link rel="icon" href="images/favicon.png" type="image/x-icon" />
|
|
<link rel="shortcut icon" href="images/favicon.ico" type="image/ico" />
|
|
</head>
|
|
|
|
<body>
|
|
<section name="Content">
|
|
<macro name="toc">
|
|
<param name="fromDepth" value="1"/>
|
|
<param name="toDepth" value="1"/>
|
|
</macro>
|
|
</section>
|
|
|
|
<section name="ModifierOrder">
|
|
<subsection name="Description">
|
|
<p>
|
|
Checks that the order of modifiers conforms to the suggestions in
|
|
the <a
|
|
href="http://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html">Java
|
|
Language specification, sections 8.1.1, 8.3.1 and 8.4.3</a>. The
|
|
correct order is:
|
|
</p>
|
|
|
|
<ol>
|
|
<li>
|
|
<code>public</code>
|
|
</li>
|
|
<li>
|
|
<code>protected</code>
|
|
</li>
|
|
<li>
|
|
<code>private</code>
|
|
</li>
|
|
<li>
|
|
<code>abstract</code>
|
|
</li>
|
|
<li>
|
|
<code>static</code>
|
|
</li>
|
|
<li>
|
|
<code>final</code>
|
|
</li>
|
|
<li>
|
|
<code>transient</code>
|
|
</li>
|
|
<li>
|
|
<code>volatile</code>
|
|
</li>
|
|
<li>
|
|
<code>synchronized</code>
|
|
</li>
|
|
<li>
|
|
<code>native</code>
|
|
</li>
|
|
<li>
|
|
<code>strictfp</code>
|
|
</li>
|
|
</ol>
|
|
</subsection>
|
|
|
|
<subsection name="Example">
|
|
<p> To configure the check: </p>
|
|
<source>
|
|
<module name="ModifierOrder"/>
|
|
</source>
|
|
</subsection>
|
|
|
|
<subsection name="Example of Usage">
|
|
<ul>
|
|
<li>
|
|
<a href="https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/google_checks.xml#L84">
|
|
Google Style</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/sun_checks.xml#L129">
|
|
Sun Style</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://github.com/checkstyle/checkstyle/blob/master/config/checkstyle_checks.xml#L142">
|
|
Checkstyle Style</a>
|
|
</li>
|
|
</ul>
|
|
</subsection>
|
|
|
|
<subsection name="Package">
|
|
<p> com.puppycrawl.tools.checkstyle.checks.modifier </p>
|
|
</subsection>
|
|
|
|
<subsection name="Parent Module">
|
|
<p>
|
|
<a href="config.html#TreeWalker">TreeWalker</a>
|
|
</p>
|
|
</subsection>
|
|
</section>
|
|
|
|
<section name="RedundantModifier">
|
|
|
|
<subsection name="Description">
|
|
<p>
|
|
Checks for redundant modifiers in:
|
|
</p>
|
|
<ol>
|
|
<li>Interface and annotation definitions.</li>
|
|
<li>Final modifier on methods of final classes.</li>
|
|
<li>
|
|
Inner <code>interface</code> declarations that are declared
|
|
as <code>static</code>.
|
|
</li>
|
|
<li>Class constructors.</li>
|
|
<li>
|
|
Nested <code>enum</code> definitions that are declared
|
|
as <code>static</code>.
|
|
</li>
|
|
</ol>
|
|
<p>
|
|
Rationale: The Java Language Specification strongly
|
|
discourages the usage of <code>public</code> and <code>abstract</code> for method
|
|
declarations in interface definitions as a matter of style.
|
|
</p>
|
|
|
|
<p>
|
|
Interfaces by definition are abstract so the <code>abstract</code>
|
|
modifier on the interface is redundant.
|
|
</p>
|
|
|
|
<p>
|
|
Classes inside of interfaces by definition are public and static,
|
|
so the <code>public</code> and <code>static</code> modifiers
|
|
on the inner classes are redundant. On the other hand, classes
|
|
inside of interfaces can be abstract or non abstract.
|
|
So, <code>abstract</code> modifier is allowed.
|
|
</p>
|
|
|
|
<p>
|
|
Fields in interfaces and annotations are automatically
|
|
public, static and final, so these modifiers are redundant as
|
|
well.
|
|
</p>
|
|
|
|
<p>
|
|
As annotations are a form of interface, their fields are also
|
|
automatically public, static and final just as their
|
|
annotation fields are automatically public and abstract.
|
|
</p>
|
|
|
|
<p>
|
|
Enums by definition are static implicit subclasses of java.lang.Enum<E>.
|
|
So, the <code>static</code> modifier on the enums is redundant. In addition,
|
|
if enum is inside of interface, <code>public</code> modifier is also redundant.
|
|
</p>
|
|
|
|
<p>
|
|
Nested <code>enum</code> types are always static by default.
|
|
</p>
|
|
|
|
<p>
|
|
Final classes by definition cannot be extended so the <code>final</code>
|
|
modifier on the method of a final class is redundant.
|
|
</p>
|
|
|
|
<p>
|
|
Public modifier for constructors in non-public non-protected classes
|
|
is always obsolete:
|
|
</p>
|
|
|
|
<source>
|
|
public class PublicClass {
|
|
public PublicClass() {} // OK
|
|
}
|
|
|
|
class PackagePrivateClass {
|
|
public PackagePrivateClass() {} // violation expected
|
|
}
|
|
</source>
|
|
|
|
<p>There is no violation in the following example,
|
|
because removing public modifier from ProtectedInnerClass
|
|
constructor will make this code not compiling:
|
|
</p>
|
|
|
|
<source>
|
|
package a;
|
|
public class ClassExample {
|
|
protected class ProtectedInnerClass {
|
|
public ProtectedInnerClass () {}
|
|
}
|
|
}
|
|
|
|
package b;
|
|
import a.ClassExample;
|
|
public class ClassExtending extends ClassExample {
|
|
ProtectedInnerClass pc = new ProtectedInnerClass();
|
|
}
|
|
</source>
|
|
</subsection>
|
|
|
|
<subsection name="Properties">
|
|
<table>
|
|
<tr>
|
|
<th>name</th>
|
|
<th>description</th>
|
|
<th>type</th>
|
|
<th>default value</th>
|
|
</tr>
|
|
<tr>
|
|
<td>tokens</td>
|
|
<td>tokens to check</td>
|
|
<td>
|
|
subset of tokens
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#METHOD_DEF">METHOD_DEF</a>,
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#VARIABLE_DEF">VARIABLE_DEF</a>,
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#ANNOTATION_FIELD_DEF">ANNOTATION_FIELD_DEF</a>,
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#INTERFACE_DEF">INTERFACE_DEF</a>,
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#CTOR_DEF">CTOR_DEF</a>,
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#CLASS_DEF">CLASS_DEF</a>,
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#ENUM_DEF">ENUM_DEF</a>.
|
|
</td>
|
|
<td>
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#METHOD_DEF">METHOD_DEF</a>,
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#VARIABLE_DEF">VARIABLE_DEF</a>,
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#ANNOTATION_FIELD_DEF">ANNOTATION_FIELD_DEF</a>,
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#INTERFACE_DEF">INTERFACE_DEF</a>,
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#CTOR_DEF">CTOR_DEF</a>,
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#CLASS_DEF">CLASS_DEF</a>,
|
|
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#ENUM_DEF">ENUM_DEF</a>.
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</subsection>
|
|
|
|
<subsection name="Example">
|
|
<p> To configure the check: </p>
|
|
<source>
|
|
<module name="RedundantModifier"/>
|
|
</source>
|
|
|
|
<p>
|
|
To configure the check to check only methods and not variables:
|
|
</p>
|
|
<source>
|
|
<module name="RedundantModifier">
|
|
<property name="tokens" value="METHOD_DEF"/>
|
|
</module>
|
|
</source>
|
|
</subsection>
|
|
|
|
<subsection name="Example of Usage">
|
|
<ul>
|
|
<li>
|
|
<a href="https://github.com/checkstyle/checkstyle/blob/master/src/main/resources/sun_checks.xml#L130">
|
|
Sun Style</a>
|
|
</li>
|
|
<li>
|
|
<a href="https://github.com/checkstyle/checkstyle/blob/master/config/checkstyle_checks.xml#L189">
|
|
Checkstyle Style</a>
|
|
</li>
|
|
</ul>
|
|
</subsection>
|
|
|
|
<subsection name="Package">
|
|
<p> com.puppycrawl.tools.checkstyle.checks.modifier </p>
|
|
</subsection>
|
|
|
|
<subsection name="Parent Module">
|
|
<p>
|
|
<a href="config.html#TreeWalker">TreeWalker</a>
|
|
</p>
|
|
</subsection>
|
|
</section>
|
|
</body>
|
|
</document>
|