blob: 6305ca6ecc8d64b6d38a5982cc78d861d48aa1cb [file] [log] [blame]
<?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>Since Checkstyle 3.0</p>
<p>
Checks that the order of modifiers conforms to the suggestions in
the <a
href="https://docs.oracle.com/javase/specs/jls/se8/html/jls-8.html">Java
Language specification, sections 8.1.1, 8.3.1, 8.4.3</a> and <a
href="https://docs.oracle.com/javase/specs/jls/se8/html/jls-9.html">
9.4</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>default</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>
<p>
ATTENTION: We skip <a href="http://www.oracle.com/technetwork/articles/java/ma14-architect-annotations-2177655.html">
type annotations</a> from validation.
</p>
</subsection>
<subsection name="Examples">
<p> To configure the check: </p>
<source>
&lt;module name=&quot;ModifierOrder&quot;/&gt;
</source>
</subsection>
<subsection name="Example of Usage">
<ul>
<li>
<a href="https://github.com/search?q=path%3Asrc%2Fmain%2Fresources+filename%3Agoogle_checks.xml+repo%3Acheckstyle%2Fcheckstyle+ModifierOrder">
Google Style</a>
</li>
<li>
<a href="https://github.com/search?q=path%3Asrc%2Fmain%2Fresources+filename%3Asun_checks.xml+repo%3Acheckstyle%2Fcheckstyle+ModifierOrder">
Sun Style</a>
</li>
<li>
<a href="https://github.com/search?q=path%3Aconfig+filename%3Acheckstyle_checks.xml+repo%3Acheckstyle%2Fcheckstyle+ModifierOrder">
Checkstyle Style</a>
</li>
</ul>
</subsection>
<subsection name="Error Messages">
<ul>
<li>
<a href="https://github.com/search?q=path%3Asrc%2Fmain%2Fresources%2Fcom%2Fpuppycrawl%2Ftools%2Fcheckstyle%2Fchecks%2Fmodifier+filename%3Amessages*.properties+repo%3Acheckstyle%2Fcheckstyle+%22annotation.order%22">
annotation.order</a>
</li>
<li>
<a href="https://github.com/search?q=path%3Asrc%2Fmain%2Fresources%2Fcom%2Fpuppycrawl%2Ftools%2Fcheckstyle%2Fchecks%2Fmodifier+filename%3Amessages*.properties+repo%3Acheckstyle%2Fcheckstyle+%22mod.order%22">
mod.order</a>
</li>
</ul>
<p>
All messages can be customized if the default message doesn't suit you.
Please <a href="config.html#Custom_messages">see the documentation</a> to learn how to.
</p>
</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>Since Checkstyle 3.0</p>
<p>
Checks for redundant modifiers in:
</p>
<ol>
<li>Interface and annotation definitions.</li>
<li>Final modifier on methods of final and anonymous 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&#60;E&#62;.
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>
Enums can also contain abstract methods and methods which can be overridden by the declared
enumeration fields.
See the following example:
</p>
<source>
public enum EnumClass {
FIELD_1,
FIELD_2 {
&#64;Override
public final void method1() {} // violation expected
};
public void method1() {}
public final void method2() {} // no violation expected
}
</source>
<p>
Since these methods can be overridden in these situations, the final methods are not
marked as redundant even though they can't be extended by other classes/enums.
</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>
<th>since</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>,
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#RESOURCE">RESOURCE</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>,
<a href="apidocs/com/puppycrawl/tools/checkstyle/api/TokenTypes.html#RESOURCE">RESOURCE</a>.
</td>
<td>3.0</td>
</tr>
</table>
</subsection>
<subsection name="Examples">
<p> To configure the check: </p>
<source>
&lt;module name=&quot;RedundantModifier&quot;/&gt;
</source>
<p>
To configure the check to check only methods and not variables:
</p>
<source>
&lt;module name=&quot;RedundantModifier&quot;&gt;
&lt;property name=&quot;tokens&quot; value=&quot;METHOD_DEF&quot;/&gt;
&lt;/module&gt;
</source>
</subsection>
<subsection name="Example of Usage">
<ul>
<li>
<a href="https://github.com/search?q=path%3Asrc%2Fmain%2Fresources+filename%3Asun_checks.xml+repo%3Acheckstyle%2Fcheckstyle+RedundantModifier">
Sun Style</a>
</li>
<li>
<a href="https://github.com/search?q=path%3Aconfig+filename%3Acheckstyle_checks.xml+repo%3Acheckstyle%2Fcheckstyle+RedundantModifier">
Checkstyle Style</a>
</li>
</ul>
</subsection>
<subsection name="Error Messages">
<ul>
<li>
<a href="https://github.com/search?q=path%3Asrc%2Fmain%2Fresources%2Fcom%2Fpuppycrawl%2Ftools%2Fcheckstyle%2Fchecks%2Fmodifier+filename%3Amessages*.properties+repo%3Acheckstyle%2Fcheckstyle+%22redundantModifier%22">
redundantModifier</a>
</li>
</ul>
<p>
All messages can be customized if the default message doesn't suit you.
Please <a href="config.html#Custom_messages">see the documentation</a> to learn how to.
</p>
</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>