<!DOCTYPE html>
<!--
 | Generated by Apache Maven Doxia Site Renderer 1.9.1 from src/site/xdoc/javastyle.xml at 2019-12-11
 | Rendered using Apache Maven Fluido Skin 1.8
-->
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <meta name="generator" content="Apache Maven Doxia Site Renderer 1.9.1" />
    <title>Log4j &#x2013; Java Style Guidelines</title>
    <link rel="stylesheet" href="./css/apache-maven-fluido-1.8.min.css" />
    <link rel="stylesheet" href="./css/site.css" />
    <link rel="stylesheet" href="./css/print.css" media="print" />
    <script src="./js/apache-maven-fluido-1.8.min.js"></script>
  </head>
  <body class="topBarDisabled">
    <div class="container-fluid">
      <header>
        <div id="banner">
          <div class="pull-left"><a href="http://logging.apache.org" id="bannerLeft"><img src="images/ls-logo.jpg"  alt=""/></a></div>
          <div class="pull-right"><a href="http://logging.apache.org/log4j/2.x" id="bannerRight"><img src="images/logo.png"  alt=""/></a></div>
          <div class="clear"><hr/></div>
        </div>

        <div id="breadcrumbs">
          <ul class="breadcrumb">
        <li id="publishDate">Last Published: 2019-12-11<span class="divider">|</span>
</li>
          <li id="projectVersion">Version: 2.13.0</li>
      <li class="pull-right"><span class="divider">|</span>
<a href="https://github.com/apache/logging-log4j2" class="externalLink" title="GitHub">GitHub</a></li>
      <li class="pull-right"><span class="divider">|</span>
<a href="https://analysis.apache.org/dashboard/index/org.apache.logging.log4j:log4j" class="externalLink" title="Sonar">Sonar</a></li>
      <li class="pull-right"><span class="divider">|</span>
<a href="../../" title="Logging Services">Logging Services</a></li>
      <li class="pull-right"><span class="divider">|</span>
<a href="https://www.apache.org/" class="externalLink" title="Apache">Apache</a></li>
      <li class="pull-right"><a href="https://cwiki.apache.org/confluence/display/LOGGING/Log4j" class="externalLink" title="Logging Wiki">Logging Wiki</a></li>
          </ul>
        </div>
      </header>
      <div class="row-fluid">
        <header id="leftColumn" class="span2">
          <nav class="well sidebar-nav">
  <ul class="nav nav-list">
   <li class="nav-header"><img class="imageLink" src="img/glyphicons/home.png" alt="Apache Log4j™ 2" border="0"/> Apache Log4j™ 2</li>
    <li><a href="index.html" title="About"><span class="none"></span>About</a></li>
    <li><a href="download.html" title="Download"><span class="none"></span>Download</a></li>
    <li><a href="javadoc.html" title="Javadoc"><span class="icon-chevron-right"></span>Javadoc</a></li>
    <li><a href="maven-artifacts.html" title="Maven, Ivy, Gradle Artifacts"><span class="icon-chevron-right"></span>Maven, Ivy, Gradle Artifacts</a></li>
    <li><a href="runtime-dependencies.html" title="Runtime Dependencies"><span class="none"></span>Runtime Dependencies</a></li>
    <li><a href="changelog.html" title="Changelog"><span class="none"></span>Changelog</a></li>
    <li><a href="faq.html" title="FAQ"><span class="none"></span>FAQ</a></li>
    <li><a href="performance.html" title="Performance"><span class="icon-chevron-right"></span>Performance</a></li>
    <li><a href="articles.html" title="Articles and Tutorials"><span class="none"></span>Articles and Tutorials</a></li>
    <li><a href="thanks.html" title="Thanks"><span class="none"></span>Thanks</a></li>
   <li class="nav-header"><img class="imageLink" src="img/glyphicons/pencil.png" alt="For Contributors" border="0"/> For Contributors</li>
    <li><a href="build.html" title="Building Log4j from Source"><span class="none"></span>Building Log4j from Source</a></li>
    <li><a href="guidelines.html" title="Guidelines"><span class="none"></span>Guidelines</a></li>
    <li class="active"><a href="#"><span class="none"></span>Style Guide</a></li>
   <li class="nav-header"><img class="imageLink" src="img/glyphicons/book.png" alt="Manual" border="0"/> Manual</li>
    <li><a href="manual/index.html" title="Introduction"><span class="none"></span>Introduction</a></li>
    <li><a href="manual/architecture.html" title="Architecture"><span class="none"></span>Architecture</a></li>
    <li><a href="manual/compatibility.html" title="Log4j 1.x Compatibility"><span class="none"></span>Log4j 1.x Compatibility</a></li>
    <li><a href="manual/migration.html" title="Log4j 1.x Migration"><span class="none"></span>Log4j 1.x Migration</a></li>
    <li><a href="manual/api.html" title="Java API"><span class="icon-chevron-right"></span>Java API</a></li>
    <li><a href="manual/scala-api.html" title="Scala API"><span class="none"></span>Scala API</a></li>
    <li><a href="manual/configuration.html" title="Configuration"><span class="icon-chevron-right"></span>Configuration</a></li>
    <li><a href="manual/usage.html" title="Usage"><span class="icon-chevron-right"></span>Usage</a></li>
    <li><a href="manual/webapp.html" title="Web Applications and JSPs"><span class="icon-chevron-right"></span>Web Applications and JSPs</a></li>
    <li><a href="manual/lookups.html" title="Lookups"><span class="icon-chevron-right"></span>Lookups</a></li>
    <li><a href="manual/appenders.html" title="Appenders"><span class="icon-chevron-right"></span>Appenders</a></li>
    <li><a href="manual/layouts.html" title="Layouts"><span class="icon-chevron-right"></span>Layouts</a></li>
    <li><a href="manual/filters.html" title="Filters"><span class="icon-chevron-right"></span>Filters</a></li>
    <li><a href="manual/async.html" title="Async Loggers"><span class="icon-chevron-right"></span>Async Loggers</a></li>
    <li><a href="manual/garbagefree.html" title="Garbage-free Logging"><span class="icon-chevron-right"></span>Garbage-free Logging</a></li>
    <li><a href="manual/jmx.html" title="JMX"><span class="none"></span>JMX</a></li>
    <li><a href="manual/logsep.html" title="Logging Separation"><span class="none"></span>Logging Separation</a></li>
    <li><a href="manual/extending.html" title="Extending Log4j"><span class="icon-chevron-right"></span>Extending Log4j</a></li>
    <li><a href="manual/plugins.html" title="Plugins"><span class="icon-chevron-right"></span>Plugins</a></li>
    <li><a href="manual/customconfig.html" title="Programmatic Log4j Configuration"><span class="icon-chevron-right"></span>Programmatic Log4j Configuration</a></li>
    <li><a href="manual/customloglevels.html" title="Custom Log Levels"><span class="icon-chevron-right"></span>Custom Log Levels</a></li>
   <li class="nav-header"><img class="imageLink" src="img/glyphicons/tag.png" alt="Related Projects" border="0"/> Related Projects</li>
    <li><a href="http://logging.apache.org/log4j/scala/index.html" class="externalLink" title="Log4j-Scala"><span class="none"></span>Log4j-Scala</a></li>
   <li class="nav-header"><img class="imageLink" src="img/glyphicons/link.png" alt="Legacy Sites" border="0"/> Legacy Sites</li>
    <li><a href="http://logging.apache.org/log4j/1.2/" class="externalLink" title="Log4j 1.2 - End of Life"><span class="none"></span>Log4j 1.2 - End of Life</a></li>
    <li><a href="http://logging.apache.org/log4j/log4j-2.3/" class="externalLink" title="Log4j 2.3 - Java 6"><span class="none"></span>Log4j 2.3 - Java 6</a></li>
    <li><a href="http://logging.apache.org/log4j/log4j-2.12.1" class="externalLink" title="Log4j 2.12.1 - Java 7"><span class="none"></span>Log4j 2.12.1 - Java 7</a></li>
   <li class="nav-header"><img class="imageLink" src="img/glyphicons/cog.png" alt="Components" border="0"/> Components</li>
    <li><a href="log4j-api/index.html" title="API"><span class="none"></span>API</a></li>
    <li><a href="log4j-core/index.html" title="Implementation"><span class="none"></span>Implementation</a></li>
    <li><a href="log4j-jcl/index.html" title="Commons Logging Bridge"><span class="none"></span>Commons Logging Bridge</a></li>
    <li><a href="log4j-1.2-api/index.html" title="Log4j 1.2 API"><span class="none"></span>Log4j 1.2 API</a></li>
    <li><a href="log4j-slf4j-impl/index.html" title="SLF4J Binding"><span class="none"></span>SLF4J Binding</a></li>
    <li><a href="log4j-jul/index.html" title="JUL Adapter"><span class="none"></span>JUL Adapter</a></li>
    <li><a href="log4j-to-slf4j/index.html" title="Log4j 2 to SLF4J Adapter"><span class="none"></span>Log4j 2 to SLF4J Adapter</a></li>
    <li><a href="log4j-flume-ng/index.html" title="Apache Flume Appender"><span class="none"></span>Apache Flume Appender</a></li>
    <li><a href="log4j-taglib/index.html" title="Log4j Tag Library"><span class="none"></span>Log4j Tag Library</a></li>
    <li><a href="log4j-jmx-gui/index.html" title="Log4j JMX GUI"><span class="none"></span>Log4j JMX GUI</a></li>
    <li><a href="log4j-web/index.html" title="Log4j Web Application Support"><span class="none"></span>Log4j Web Application Support</a></li>
    <li><a href="log4j-appserver/index.html" title="Log4j Application Server Integration"><span class="none"></span>Log4j Application Server Integration</a></li>
    <li><a href="log4j-couchdb/index.html" title="Log4j CouchDB appender"><span class="none"></span>Log4j CouchDB appender</a></li>
    <li><a href="log4j-mongodb2/index.html" title="Log4j MongoDB2 appender"><span class="none"></span>Log4j MongoDB2 appender</a></li>
    <li><a href="log4j-mongodb3/index.html" title="Log4j MongoDB3 appender"><span class="none"></span>Log4j MongoDB3 appender</a></li>
    <li><a href="log4j-cassandra/index.html" title="Log4j Cassandra appender"><span class="none"></span>Log4j Cassandra appender</a></li>
    <li><a href="log4j-iostreams/index.html" title="Log4j IO Streams"><span class="none"></span>Log4j IO Streams</a></li>
    <li><a href="log4j-liquibase/index.html" title="Log4j Liquibase Binding"><span class="none"></span>Log4j Liquibase Binding</a></li>
    <li><a href="log4j-docker/index.html" title="Log4j Docker Support"><span class="none"></span>Log4j Docker Support</a></li>
    <li><a href="log4j-spring-cloud-config/log4j-spring-cloud-config-client/index.html" title="Log4j Spring Cloud Config Client"><span class="none"></span>Log4j Spring Cloud Config Client</a></li>
   <li class="nav-header"><img class="imageLink" src="img/glyphicons/info.png" alt="Project Information" border="0"/> Project Information</li>
    <li><a href="dependency-convergence.html" title="Dependency Convergence"><span class="none"></span>Dependency Convergence</a></li>
    <li><a href="dependency-management.html" title="Dependency Management"><span class="none"></span>Dependency Management</a></li>
    <li><a href="team-list.html" title="Project Team"><span class="none"></span>Project Team</a></li>
    <li><a href="mail-lists.html" title="Mailing Lists"><span class="none"></span>Mailing Lists</a></li>
    <li><a href="issue-tracking.html" title="Issue Tracking"><span class="none"></span>Issue Tracking</a></li>
    <li><a href="license.html" title="Project License"><span class="none"></span>Project License</a></li>
    <li><a href="source-repository.html" title="Source Repository"><span class="none"></span>Source Repository</a></li>
    <li><a href="project-summary.html" title="Project Summary"><span class="none"></span>Project Summary</a></li>
   <li class="nav-header"><img class="imageLink" src="img/glyphicons/layers.png" alt="Project Reports" border="0"/> Project Reports</li>
    <li><a href="changes-report.html" title="Changes Report"><span class="none"></span>Changes Report</a></li>
    <li><a href="jira-report.html" title="JIRA Report"><span class="none"></span>JIRA Report</a></li>
    <li><a href="rat-report.html" title="RAT Report"><span class="none"></span>RAT Report</a></li>
  </ul>
          </nav>
          <div class="well sidebar-nav">
            <hr />
            <div id="poweredBy">
              <div class="clear"></div>
              <div class="clear"></div>
              <div class="clear"></div>
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy"><img class="builtBy" alt="Built by Maven" src="./images/logos/maven-feather.png" /></a>
            </div>
          </div>
        </header>
        <main id="bodyColumn"  class="span10" >


  
    <section>
<h2><a name="Apache_Log4j_Code_Style_Guidelines"></a>Apache Log4j Code Style Guidelines</h2>
      <a name="intro"></a>
      <section>
<h3><a name="Introduction"></a>Introduction</h3>
        
<p>This document serves as the <b>complete</b> definition of the Log4j project's coding standards for
          source code in the Java&#x2122; Programming Language. It originated from the Google coding standards but incorporates
          modifications that reflect the desires of the Log4j community.</p>
        
<p>Like other programming style guides, the issues covered span not only aesthetic issues of
        formatting, but other types of conventions or coding standards as well. However, this document
        focuses primarily on the <b>hard-and-fast rules</b> that we follow universally, and
        avoids giving <i>advice</i> that isn't clearly enforceable (whether by human or tool).</p>
      <a name="terminology"></a>
      </section><section>
<h3><a name="Terminology_notes"></a>Terminology notes</h3>
        
<p>In this document, unless otherwise clarified:</p>
        
<ol style="list-style-type: decimal">
          
<li>The term <i>class</i> is used inclusively to mean an &quot;ordinary&quot; class, enum class, interface or
             annotation type (@interface).</li>
          
<li>The term <i>comment</i> always refers to <i>implementation</i> comments. We do not
            use the phrase &quot;documentation comments&quot;, instead using the common term &quot;Javadoc.&quot;</li>
        </ol>
        
<p>Other &quot;terminology notes&quot; will appear occasionally throughout the document.</p>
      <a name="guide-notes"></a>
      </section><section>
<h3><a name="Guide_notes"></a>Guide notes</h3>
      
<p>Example code in this document is <b>non-normative</b>. That is, while the examples
        are in Log4j Style, they may not illustrate the <i>only</i> stylish way to represent the
        code. Optional formatting choices made in examples should not be enforced as rules.</p>
      </section>
      <a name="source-file-basics"></a>
      <section>
<h3><a name="Source_File_Basics"></a>Source File Basics</h3>
      <a name="file-name"></a>
      </section><section>
<h3><a name="File_name"></a>File name</h3>
      
<p>The source file name consists of the case-sensitive name of the top-level class it contains,
        plus the .java extension.</p>
      <a name="file-encoding"></a>
      </section><section>
<h3><a name="a2.2_File_encoding:_UTF-8"></a>2.2 File encoding: UTF-8</h3>
      
<p>Source files are encoded in <b>UTF-8</b>.</p>
      <a name="special-characters"></a>
      </section><section>
<h3><a name="Special_characters"></a>Special characters</h3>
      <a name="whitespace-characters"></a>
      <section>
<h4><a name="Whitespace_characters"></a>Whitespace characters</h4>
      
<p>Aside from the line terminator sequence, the <b>ASCII horizontal space
        character</b> (<b>0x20</b>) is the only whitespace character that appears
        anywhere in a source file. This implies that:</p>
        
<ol style="list-style-type: decimal">
          
<li>All other whitespace characters in string and character literals are escaped.</li>
          
<li>Tab characters are <b>not</b> used for indentation.</li>
        </ol>
      <a name="special-escape-sequences"></a>
      </section><section>
<h4><a name="Special_escape_sequences"></a>Special escape sequences</h4>
      
<p>For any character that has a special escape sequence
        (\b,
        \t,
        \n,
        \f,
        \r,
        \&quot;,
        \' and
        \\), that sequence is used rather than the corresponding octal
        (e.g. \012) or Unicode (e.g. \u000a) escape.</p>
      <a name="non-ascii-characters"></a>
      </section><section>
<h4><a name="Non-ASCII_characters"></a>Non-ASCII characters</h4>
        
<p>For the remaining non-ASCII characters, either the actual Unicode character
          (e.g. &#x221e;) or the equivalent Unicode escape (e.g. \u221e) is used, depending only on which
          makes the code <b>easier to read and understand</b>.</p>
        
<p><b>Tip:</b> In the Unicode escape case, and occasionally even when actual
          Unicode characters are used, an explanatory comment can be very helpful.</p>
        
<p>Examples:</p>
          
<table border="0" class="table table-striped">
            
<tr class="a">
<th>Example</th>
<th>Discussion</th></tr>
            
<tr class="b">
<td>String unitAbbrev = &quot;&#x3bc;s&quot;;</td>
<td>Best: perfectly clear even without a comment.</td></tr>
            
<tr class="a">
<td>String unitAbbrev = &quot;\u03bcs&quot;; // &quot;&#x3bc;s&quot;</td>
<td>Allowed, but there's no reason to do this.</td></tr>
            
<tr class="b">
<td>String unitAbbrev = &quot;\u03bcs&quot;; // Greek letter mu, &quot;s&quot;</td>
<td>Allowed, but awkward and prone to mistakes.</td></tr>
            
<tr class="a">
<td>String unitAbbrev = &quot;\u03bcs&quot;;</td>
<td>Poor: the reader has no idea what this is.</td></tr>
            
<tr class="b">
<td>return '\ufeff' + content; // byte order mark</td>
<td>Good: use escapes for non-printable characters, and comment if necessary.</td></tr>
          </table>
        
<p><b>Tip:</b> Never make your code less readable simply out of fear that
          some programs might not handle non-ASCII characters properly. If that should happen, those
          programs are <b>broken</b> and they must be <b>fixed</b>.</p>
      </section></section>
      <a name="filestructure"></a>
      <a name="source-file-structure"></a>
      <section>
<h3><a name="Source_file_structure"></a>Source file structure</h3>
        
<p>A source file consists of, <b>in order</b>:</p>
          
<ol style="list-style-type: decimal">
            
<li>Apache license</li>
            
<li>Package statement</li>
            
<li>Import statements</li>
            
<li>Exactly one top-level class</li>
          </ol>
        
<p><b>Exactly one blank line</b> separates each section that is present.</p>
        <a name="license"></a>
      </section><section>
<h3><a name="Apache_License"></a>Apache License</h3>
        
<p>The Apache license belongs here. No other license should appear. Other licenses that apply should be referenced in
          a NOTICE file</p>
      <a name="package-statement"></a>
      </section><section>
<h3><a name="Package_statement"></a>Package statement</h3>
      
<p>The package statement is <b>not line-wrapped</b>. The column limit
        (<a href="#column-limit">Column limit: 120</a>) does not apply to package statements.</p>
      <a name="imports"></a>
      <a name="import-statements"></a>
      </section><section>
<h3><a name="Import_statements"></a>Import statements</h3>
      <a name="wildcard-imports"></a>
      <section>
<h4><a name="No_wildcard_imports_in_the_main_tree"></a>No wildcard imports in the main tree</h4>
        
<p><b>Wildcard imports</b>, static or otherwise, <b>are not used</b>.</p>
      </section><section>
<h4><a name="Static_wildcard_imports_in_the_test_tree"></a>Static wildcard imports in the test tree</h4>
        
<p><b>Wildcard static imports</b> are encouraged for test imports like JUnit, EasyMock, and Hamcrest.</p>
      <a name="import-line-wrapping"></a>
      </section><section>
<h4><a name="No_line-wrapping"></a>No line-wrapping</h4>
      
<p>Import statements are <b>not line-wrapped</b>. The column limit
        (<a href="#column-limit">Column limit: 120</a>) does not apply to import statements.</p>
      <a name="import-ordering-and-spacing"></a>
      </section><section>
<h4><a name="Ordering_and_spacing"></a>Ordering and spacing</h4>
      
<p>Import statements are divided into the following groups, in this order, with each group
        separated by a single blank line:</p>
        
<ol style="list-style-type: decimal">
          
<li>java</li>
          
<li>javax</li>
          
<li>org</li>
          
<li>com</li>
          
<li>All static imports in a single group</li>
        </ol>
      
<p>Within a group there are no blank lines, and the imported names appear in ASCII sort
      order. (<b>Note:</b> this is not the same as the import <i>statements</i> being in
      ASCII sort order; the presence of semicolons warps the result.)</p>
      
<p>IDE settings for ordering imports automatically can be found in the source distributions under
      src/ide. For example:</p>
      
<ul>
        
<li>Eclipse: src/ide/eclipse/4.3.2/organize-imports.importorder</li>
        
<li>IntelliJ: src/ide/Intellij/13/IntellijSettings.jar</li>
      </ul>
      <a name="class-declaration"></a>
      </section></section><section>
<h3><a name="Class_declaration"></a>Class declaration</h3>
      <a name="oneclassperfile"></a>
      <a name="one-top-level-class"></a>
      <section>
<h4><a name="Exactly_one_top-level_class_declaration"></a>Exactly one top-level class declaration</h4>
        
<p>Each top-level class resides in a source file of its own.</p>
      <a name="class-member-ordering"></a>
      </section><section>
<h4><a name="Class_member_ordering"></a>Class member ordering</h4>
      
<p>Class members should be grouped in the following order&gt;.</p>
      
<ol style="list-style-type: decimal">
        
<li>static variables grouped in the order shown below. Within a group variables may appear in any order.</li>
        
<li>
          
<ol style="list-style-type: decimal">
            
<li>public</li>
            
<li>protected</li>
            
<li>package</li>
            
<li>private</li>
          </ol>
        </li>
        
<li>instance variables grouped in the order shown below. Within a group variables may appear in any order</li>
        
<li>
          
<ol style="list-style-type: decimal">
            
<li>public</li>
            
<li>protected</li>
            
<li>package</li>
            
<li>private</li>
          </ol>
        </li>
        
<li>constructors</li>
        
<li>methods may be specified in the following order but may appear in another order if it improves the
          clarity of the program.</li>
        
<li>
          
<ol style="list-style-type: decimal">
            
<li>public</li>
            
<li>protected</li>
            
<li>package</li>
            
<li>private</li>
          </ol>
        </li>
      </ol>
      <a name="overloads"></a>
      <a name="never-split"></a>
      <section>
<h5><a name="Overloads:_never_split"></a>Overloads: never split</h5>
      
<p>When a class has multiple constructors, or multiple methods with the same name, these appear
        sequentially, with no intervening members.</p>
      </section></section></section>
      <a name="formatting"></a>
      <section>
<h3><a name="Formatting"></a>Formatting</h3>
      
<p><b>Terminology Note:</b> <i>block-like construct</i> refers to
        the body of a class, method or constructor. Note that, by
        <a href="array-initializers">array initializers</a>, any array initializer
        <i>may</i> optionally be treated as if it were a block-like construct.</p>
      <a name="braces"></a>
      </section><section>
<h3><a name="Braces"></a>Braces</h3>
      <a name="braces-always-used"></a>
      <section>
<h4><a name="Braces_are_used_where_optional"></a>Braces are used where optional</h4>
      
<p>Braces are used with
        if,
        else,
        for,
        do and
        while statements, even when the
        body is empty or contains only a single statement.</p>
      <a name="blocks-k-r-style"></a>
      </section><section>
<h4><a name="Nonempty_blocks:_K_.26_R_style"></a>Nonempty blocks: K &amp; R style</h4>
      
<p>Braces follow the Kernighan and Ritchie style
        (&quot;<a class="externalLink" href="http://www.codinghorror.com/blog/2012/07/new-programming-jargon.html">Egyptian brackets</a>&quot;)
        for <i>nonempty</i> blocks and block-like constructs:</p>
<ul>
<li>No line break before the opening brace.</li>
<li>Line break after the opening brace.</li>
<li>Line break before the closing brace.</li>
<li>Line break after the closing brace <i>if</i> that brace terminates a statement or the body
      of a method, constructor or <i>named</i> class. For example, there is <i>no</i> line break
      after the brace if it is followed by else or a
      comma.</li></ul>
<p>Example:</p>

<div>
<pre>
      return new MyClass() {
          @Override public void method() {
              if (condition()) {
                  try {
                      something();
                  } catch (ProblemException e) {
                      recover();
                  }
              }
          }
      };
    </pre></div>
<p>A few exceptions for enum classes are given in Section 4.8.1,
      <a href="enum-classes">Enum classes</a>.</p>
      <a name="emptyblocks"></a>
      <a name="braces-empty-blocks"></a>
      </section><section>
<h4><a name="Empty_blocks:_may_be_concise"></a>Empty blocks: may be concise</h4>
      
<p>An empty block or block-like construct <i>may</i> be closed immediately after it is
        opened, with no characters or line break in between
        ({}), <b>unless</b> it is part of a
        <i>multi-block statement</i> (one that directly contains multiple blocks:
        if/else-if/else or
        try/catch/finally).</p>
        
<p>Example:</p>
<div>
<pre>
      void doNothing() {}
    </pre></div><a name="block-indentation"></a>
      </section></section><section>
<h3><a name="Block_indentation:_.2B4_spaces"></a>Block indentation: +4 spaces</h3>
      
<p>Each time a new block or block-like construct is opened, the indent increases by four
        spaces. When the block ends, the indent returns to the previous indent level. The indent level
        applies to both code and comments throughout the block. (See the example in Section 4.1.2,
        <a href="#blocks-k-r-style">Nonempty blocks: K &amp; R Style</a>.)</p>
        <a name="one-statement-per-line"></a>
      </section><section>
<h3><a name="One_statement_per_line"></a>One statement per line</h3>
      
<p>Each statement is followed by a line-break.</p>
        <a name="columnlimit"></a>
        <a name="column-limit"></a>
      </section><section>
<h3><a name="Column_limit:_120"></a>Column limit: 120</h3>
      
<p>
        The column limit for Log4j is 120 characters.

        Except as noted below, any line that would exceed this limit must be line-wrapped, as explained in
        <a href="#line-wrapping">Line-wrapping</a>.
      </p>
<p><b>Exceptions:</b></p>
        
<ol style="list-style-type: decimal">
          
<li>Lines where obeying the column limit is not possible (for example, a long URL in Javadoc,
      or a long JSNI method reference).</li>
          
<li>package and import statements (see <a href="#package-statement">Package statement</a> and
      <a href="#import-statements">Import statements</a>).</li>
          
<li>Command lines in a comment that may be cut-and-pasted into a shell.</li>
        </ol><a name="line-wrapping"></a>
      </section><section>
<h3><a name="Line-wrapping"></a>Line-wrapping</h3>
      
<p class="terminology"><b>Terminology Note:</b> When code that might otherwise legally
        occupy a single line is divided into multiple lines, typically to avoid overflowing the column
        limit, this activity is called
        <i>line-wrapping</i>.</p>
        
<p>There is no comprehensive, deterministic formula showing <i>exactly</i> how to line-wrap in
      every situation. Very often there are several valid ways to line-wrap the same piece of code.</p>
        
<p class="tip"><b>Tip:</b> Extracting a method or local variable may solve the problem
      without the need to line-wrap.</p>
      <a name="line-wrapping-where-to-break"></a>
      <section>
<h4><a name="Where_to_break"></a>Where to break</h4>
      
<p>The prime directive of line-wrapping is: prefer to break at a
        <b>higher syntactic level</b>. Also:</p>
        
<ol style="list-style-type: decimal">
          
<li>When a line is broken at a <i>non-assignment</i> operator the break comes <i>before</i>
      the symbol. (Note that this is not the same practice used in Google style for other languages,
      such as C++ and JavaScript.)
            
<ul>
              
<li>This also applies to the following &quot;operator-like&quot; symbols: the dot separator
        (.), the ampersand in type bounds
        (&lt;T extends Foo &amp; Bar&gt;), and the pipe in
        catch blocks
        (catch (FooException | BarException e)).</li>
            </ul>
          </li>
          
<li>When a line is broken at an <i>assignment</i> operator the break typically comes
      <i>after</i> the symbol, but either way is acceptable.
            
<ul>
              
<li>This also applies to the &quot;assignment-operator-like&quot; colon in an enhanced
        for (&quot;foreach&quot;) statement.</li>
            </ul>
          </li>
          
<li>A method or constructor name stays attached to the open parenthesis
      (() that follows it.</li>
          
<li>A comma (,) stays attached to the token that
      precedes it.</li>
        </ol>
        <a name="indentation"></a>
        <a name="line-wrapping-indent"></a>
      </section><section>
<h4><a name="Indent_continuation_lines_at_least_.2B8_spaces"></a>Indent continuation lines at least +8 spaces</h4>
        
<p>When line-wrapping, each line after the first (each <i>continuation line</i>) is indented
          at least +8 from the original line.</p>
        
<p>When there are multiple continuation lines, indentation may be varied beyond +8 as
      desired. In general, two continuation lines use the same indentation level if and only if they
      begin with syntactically parallel elements.</p>
        
<p>The section on <a href="#horizontal-alignment">Horizontal alignment</a> addresses
      the discouraged practice of using a variable number of spaces to align certain tokens with
      previous lines.</p>
        <a name="whitespace"></a>
      </section></section><section>
<h3><a name="Whitespace"></a>Whitespace</h3>
      <a name="vertical-whitespace"></a>
      <section>
<h4><a name="Vertical_Whitespace"></a>Vertical Whitespace</h4>
      
<p>A single blank line appears:</p>
        
<ol style="list-style-type: decimal">
          
<li><i>Between</i> consecutive members (or initializers) of a class: fields, constructors,
      methods, nested classes, static initializers, instance initializers.
            
<ul>
              
<li><span class="exception"><b>Exception:</b> A blank line between two consecutive
        fields (having no other code between them) is optional. Such blank lines are used as needed to
        create <i>logical groupings</i> of fields.</span></li>
            </ul>
          </li>
          
<li>Within method bodies, as needed to create <i>logical groupings</i> of statements.</li>
<li><i>Optionally</i> before the first member or after the last member of the class (neither
      encouraged nor discouraged).</li>
          
<li>As required by other sections of this document (such as
      <a href="#import-statements">Import statements</a>).</li>
        </ol>
        
<p><i>Multiple</i> consecutive blank lines are permitted, but never required (or encouraged).</p>
        <a name="horizontal-whitespace"></a>
      </section><section>
<h4><a name="Horizontal_whitespace"></a>Horizontal whitespace</h4>
      
<p>Beyond where required by the language or other style rules, and apart from literals, comments and
        Javadoc, a single ASCII space also appears in the following places <b>only</b>.</p>
        
<ol style="list-style-type: decimal">
          
<li>Separating any reserved word, such as
      if,
      for or
      catch, from an open parenthesis
      (()
      that follows it on that line</li>
          
<li>Separating any reserved word, such as
      else or
      catch, from a closing curly brace
      (}) that precedes it on that line</li>
          
<li>Before any open curly brace
      ({), with two exceptions:
            
<ul>
              
<li>String[][] x = {{&quot;foo&quot;}}; (no space is required
        between {{, by item 8 below)</li>
            </ul>
          </li>
          
<li>On both sides of any binary or ternary operator. This also applies to the following
      &quot;operator-like&quot; symbols:
            
<ul>
              
<li>the ampersand in a conjunctive type bound:
        &lt;T extends Foo &amp; Bar&gt;</li>
              
<li>the pipe for a catch block that handles multiple exceptions:
        catch (FooException | BarException e)</li>
              
<li>the colon (:) in an enhanced
        for (&quot;foreach&quot;) statement</li>
            </ul>
          </li>
          
<li>After ,:; or the closing parenthesis
      ()) of a cast</li>
          
<li>On both sides of the double slash (//) that
      begins an end-of-line comment. Here, multiple spaces are allowed, but not required.</li>
          
<li>Between the type and variable of a declaration:
      List&lt;String&gt; list</li>
          
<li><i>Optional</i> just inside both braces of an array initializer
            
<ul>
              
<li>new int[] {5, 6} and
        new int[] { 5, 6 } are both valid</li>
            </ul>
          </li>
        </ol>
        
<p class="note"><b>Note:</b> This rule never requires or forbids additional space at the
      start or end of a line, only <i>interior</i> space.</p>
        <a name="horizontal-alignment"></a>
      </section><section>
<h4><a name="Horizontal_alignment:_never_required"></a>Horizontal alignment: never required</h4>
        
<p class="terminology"><b>Terminology Note:</b> <i>Horizontal alignment</i> is the
        practice of adding a variable number of additional spaces in your code with the goal of making
        certain tokens appear directly below certain other tokens on previous lines.</p>
        
<p>This practice is permitted, but is <b>never required</b> by Google Style. It is not
      even required to <i>maintain</i> horizontal alignment in places where it was already used.</p>
        
<p>Here is an example without alignment, then using alignment:</p>
        
<div>
<pre>
      private int x; // this is fine
      private Color color; // this too

      private int   x;      // permitted, but future edits
      private Color color;  // may leave it unaligned
    </pre></div>
        
<p class="tip"><b>Tip:</b> Alignment can aid readability, but it creates problems for
      future maintenance.  Consider a future change that needs to touch just one line. This change may
      leave the formerly-pleasing formatting mangled, and that is <b>allowed</b>. More often
      it prompts the coder (perhaps you) to adjust whitespace on nearby lines as well, possibly
      triggering a cascading series of reformattings. That one-line change now has a &quot;blast radius.&quot;
      This can at worst result in pointless busywork, but at best it still corrupts version history
      information, slows down reviewers and exacerbates merge conflicts.</p>
        <a name="parentheses"></a>
        <a name="grouping-parentheses"></a>
      </section></section><section>
<h3><a name="Grouping_parentheses:_recommended"></a>Grouping parentheses: recommended</h3>
      
<p>Optional grouping parentheses are omitted only when author and reviewer agree that there is no
        reasonable chance the code will be misinterpreted without them, nor would they have made the code
        easier to read. It is <i>not</i> reasonable to assume that every reader has the entire Java
        operator precedence table memorized.</p>
        <a name="specific-constructs"></a>
      </section><section>
<h3><a name="Specific_constructs"></a>Specific constructs</h3>
      <a name="enum-classes"></a>
      <section>
<h4><a name="Enum_classes"></a>Enum classes</h4>
      
<p>After each comma that follows an enum constant, a line-break is optional.</p>
<p>An enum class with no methods
        and no documentation on its constants may optionally be formatted
      as if it were an array initializer (see
      <a href="array-initializers">array initializers</a>).</p>
<div>
<pre>
      private enum Suit { CLUBS, HEARTS, SPADES, DIAMONDS }
    </pre></div>
        
<p>Since enum classes <i>are classes</i>, all other rules for formatting classes apply.</p>
        <a name="localvariables"></a>
        <a name="variable-declarations"></a>
      </section><section>
<h4><a name="Variable_declarations"></a>Variable declarations</h4>
      <a name="variables-per-declaration"></a>
      <section>
<h5><a name="One_variable_per_declaration"></a>One variable per declaration</h5>
      
<p>Every variable declaration (field or local) declares only one variable: declarations such as
        int a, b; are not used.</p>
        <a name="variables-limited-scope"></a>
      </section><section>
<h5><a name="Declared_when_needed.2C_initialized_as_soon_as_possible"></a>Declared when needed, initialized as soon as possible</h5>
      
<p>Local variables are <b>not</b> habitually declared at the start of their containing
        block or block-like construct. Instead, local variables are declared close to the point they are
        first used (within reason), to minimize their scope. Local variable declarations typically have
        initializers, or are initialized immediately after declaration.</p><a name="s4.8.3-arrays"></a>
      </section></section><section>
<h4><a name="Arrays"></a>Arrays</h4>
      <a name="array-initializers"></a>
      <section>
<h5><a name="Array_initializers:_can_be_.22block-like.22"></a>Array initializers: can be &quot;block-like&quot;</h5>
      
<p>Any array initializer may <i>optionally</i> be formatted as if it were a &quot;block-like
        construct.&quot; For example, the following are all valid (<b>not</b> an exhaustive
        list):</p>
<div>
<pre>
      new int[] {           new int[] {
        0, 1, 2, 3            0,
      }                       1,
                              2,
      new int[] {             3,
        0, 1,               }
        2, 3
      }                     new int[]
                                {0, 1, 2, 3}
    </pre></div><a name="array-declarations"></a>
      </section><section>
<h5><a name="No_C-style_array_declarations"></a>No C-style array declarations</h5>
      
<p>The square brackets form a part of the <i>type</i>, not the variable:
        String[] args, not
        String args[].</p>
        <a name="switch"></a>
      </section></section><section>
<h4><a name="Switch_statements"></a>Switch statements</h4>
      
<p class="terminology"><b>Terminology Note:</b> Inside the braces of a
        <i>switch block</i> are one or more <i>statement groups</i>. Each statement group consists of
        one or more <i>switch labels</i> (either case FOO: or
        default:), followed by one or more statements.</p>
        <a name="switch-indentation"></a>
      <section>
<h5><a name="Indentation"></a>Indentation</h5>
      
<p>As with any other block, the contents of a switch block are indented +2.</p>
        
<p>After a switch label, a newline appears, and the indentation level is increased +2, exactly as
      if a block were being opened. The following switch label returns to the previous indentation
      level, as if a block had been closed.</p>
        <a name="fallthrough"></a>
        <a name="switch-fall-through"></a>
      </section><section>
<h5><a name="Fall-through:_commented"></a>Fall-through: commented</h5>
      
<p>Within a switch block, each statement group either terminates abruptly (with a
        break,
        continue,
        return or thrown exception), or is marked with a comment
        to indicate that execution will or <i>might</i> continue into the next statement group. Any
        comment that communicates the idea of fall-through is sufficient (typically
        // fall through). This special comment is not required in
        the last statement group of the switch block. Example:</p>
<div>
<pre>
      switch (input) {
        case 1:
        case 2:
          prepareOneOrTwo();
          // fall through
        case 3:
          handleOneTwoOrThree();
          break;
      default:
          handleLargeNumber(input);
      }
    </pre></div><a name="switch-default"></a>
      </section><section>
<h5><a name="The_default_case_is_present"></a>The default case is present</h5>
      
<p>Each switch statement includes a default statement
        group, even if it contains no code.</p>
        <a name="annotations"></a>
      </section></section><section>
<h4><a name="Annotations"></a>Annotations</h4>
      
<p>Annotations applying to a class, method or constructor appear immediately after the
        documentation block, and each annotation is listed on a line of its own (that is, one annotation
        per line). These line breaks do not constitute line-wrapping (Section
        4.5, <a href="#line-wrapping">Line-wrapping</a>), so the indentation level is not
        increased. Example:</p>
<div>
<pre>
      @Override
      @Nullable
      public String getNameIfPresent() { ... }
    </pre></div>
<p class="exception"><b>Exception:</b> A <i>single</i> parameterless annotation
      <i>may</i> instead appear together with the first line of the signature, for example:</p>
<div>
<pre>
      @Override public int hashCode() { ... }
    </pre></div>
<p>Annotations applying to a field also appear immediately after the documentation block, but in
      this case, <i>multiple</i> annotations (possibly parameterized) may be listed on the same line;
      for example:</p>
<div>
<pre>
      @Partial @Mock DataLoader loader;
    </pre></div>
<p>There are no specific rules for formatting parameter and local variable annotations.</p>
        <a name="comments"></a>
      </section><section>
<h4><a name="Comments"></a>Comments</h4>
      <a name="block-comment-style"></a>
      <section>
<h5><a name="Block_comment_style"></a>Block comment style</h5>
      
<p>Block comments are indented at the same level as the surrounding code. They may be in
        /* ... */ style or
        // ... style. For multi-line
        /* ... */ comments, subsequent lines must start with
        * aligned with the * on the previous line.</p>
<div>
<pre>
      /*
       * This is          // And so           /* Or you can
       * okay.            // is this.          * even do this. */
       */
    </pre></div>
        
<p>Comments are not enclosed in boxes drawn with asterisks or other characters.</p>
        
<p><b>Tip:</b> When writing multi-line comments, use the
      /* ... */ style if you want automatic code formatters to
      re-wrap the lines when necessary (paragraph-style). Most formatters don't re-wrap lines in
      // ... style comment blocks.</p>
        <a name="modifiers"></a>
      </section></section><section>
<h4><a name="Modifiers"></a>Modifiers</h4>
      
<p>Class and member modifiers, when present, appear in the order
        recommended by the Java Language Specification:
      </p>
<div>
<pre>
      public protected private abstract static final transient volatile synchronized native strictfp
    </pre></div>
        <a name="numeric-literals"></a>
      </section><section>
<h4><a name="Numeric_Literals"></a>Numeric Literals</h4>
      
<p>long-valued integer literals use an uppercase L suffix, never
        lowercase (to avoid confusion with the digit 1). For example, 3000000000L
        rather than 3000000000l.</p>
      </section></section>
      <a name="naming"></a>
      <section>
<h3><a name="Naming"></a>Naming</h3>
      <a name="identifier-names"></a>
      </section><section>
<h3><a name="Rules_common_to_all_identifiers"></a>Rules common to all identifiers</h3>
      
<p>Identifiers use only ASCII letters and digits, and in two cases noted below, underscores. Thus
        each valid identifier name is matched by the regular expression \w+ .</p>
        
<p> In Google Style special prefixes or
      suffixes, like those seen in the examples name_,
      mName, s_name and
      kName, are <b>not</b> used.</p>
        <a name="specific-identifier-names"></a>
      </section><section>
<h3><a name="Rules_by_identifier_type"></a>Rules by identifier type</h3>
      <a name="package-names"></a>
      <section>
<h4><a name="Package_names"></a>Package names</h4>
      
<p>Package names are all lowercase, with consecutive words simply concatenated together (no
        underscores). For example, com.example.deepspace, not
        com.example.deepSpace or
        com.example.deep_space.</p>
        <a name="class-names"></a>
      </section><section>
<h4><a name="Class_names"></a>Class names</h4>
      
<p>Class names are written in <a href="#camel-case">UpperCamelCase</a>.</p>
        
<p>Class names are typically nouns or noun phrases. For example,
      Character or
      ImmutableList. Interface names may also be nouns or
      noun phrases (for example, List), but may sometimes be
      adjectives or adjective phrases instead (for example,
      Readable).</p>
<p>There are no specific rules or even well-established conventions for naming annotation types.</p>
<p><i>Test</i> classes are named starting with the name of the class they are testing, and ending
      with Test. For example,
      HashTest or
      HashIntegrationTest.</p>
        <a name="method-names"></a>
      </section><section>
<h4><a name="Method_names"></a>Method names</h4>
      
<p>Method names are written in <a href="#s5.3-camel-case">lowerCamelCase</a>.</p>
        
<p>Method names are typically verbs or verb phrases. For example,
      sendMessage or
      stop.</p>
<p>Underscores may appear in JUnit <i>test</i> method names to separate logical components of the
      name. One typical pattern is test<i>&lt;MethodUnderTest&gt;</i>_<i>&lt;state&gt;</i>,
      for example testPop_emptyStack. There is no One Correct
      Way to name test methods.</p>
        <a name="constants"></a>
        <a name="constant-names"></a>
      </section><section>
<h4><a name="Constant_names"></a>Constant names</h4>
      
<p>Constant names use CONSTANT_CASE: all uppercase
        letters, with words separated by underscores. But what <i>is</i> a constant, exactly?</p>
        
<p>Every constant is a static final field, but not all static final fields are constants. Before
      choosing constant case, consider whether the field really <i>feels like</i> a constant. For
      example, if any of that instance's observable state can change, it is almost certainly not a
      constant. Merely <i>intending</i> to never mutate the object is generally not
      enough. Examples:</p>
<div>
<pre>
      // Constants
      static final int NUMBER = 5;
      static final ImmutableList&lt;String&gt; NAMES = ImmutableList.of(&quot;Ed&quot;, &quot;Ann&quot;);
      static final Joiner COMMA_JOINER = Joiner.on(',');  // because Joiner is immutable
      static final SomeMutableType[] EMPTY_ARRAY = {};
      enum SomeEnum { ENUM_CONSTANT }

      // Not constants
      static String nonFinal = &quot;non-final&quot;;
      final String nonStatic = &quot;non-static&quot;;
      static final Set&lt;String&gt; mutableCollection = new HashSet&lt;String&gt;();
      static final ImmutableSet&lt;SomeMutableType&gt; mutableElements = ImmutableSet.of(mutable);
      static final Logger logger = Logger.getLogger(MyClass.getName());
      static final String[] nonEmptyArray = {&quot;these&quot;, &quot;can&quot;, &quot;change&quot;};
    </pre></div>
        
<p>These names are typically nouns or noun phrases.</p>
        <a name="non-constant-field-names"></a>
      </section><section>
<h4><a name="Non-constant_field_names"></a>Non-constant field names</h4>
      
<p>Non-constant field names (static or otherwise) are written
        in <a href="#camel-case">lowerCamelCase</a>.</p>
        
<p>These names are typically nouns or noun phrases.  For example,
      computedValues or
      index.</p>
        <a name="parameter-names"></a>
      </section><section>
<h4><a name="Parameter_names"></a>Parameter names</h4>
      
<p>Parameter names are written in <a href="#camel-case">lowerCamelCase</a>.</p>
        
<p>One-character parameter names should be avoided.</p>
        <a name="local-variable-names"></a>
      </section><section>
<h4><a name="Local_variable_names"></a>Local variable names</h4>
      
<p>Local variable names are written in <a href="#camel-case">lowerCamelCase</a>, and can be
        abbreviated more liberally than other types of names.</p>
<p>However, one-character names should be avoided, except for temporary and looping variables.</p>
<p>Even when final and immutable, local variables are not considered to be constants, and should not
      be styled as constants.</p>
        <a name="type-variable-names"></a>
      </section><section>
<h4><a name="Type_variable_names"></a>Type variable names</h4>
      
<p>Each type variable is named in one of two styles:</p>
<ul>
<li>A single capital letter, optionally followed by a single numeral (such as
      E, T,
      X, T2)
    </li>
<li>A name in the form used for classes (see
      <a href="#class-names">Class names</a>), followed by the capital letter
      T (examples:
      RequestT,
      FooBarT).</li></ul><a name="acronyms"></a>
        <a name="camelcase"></a>
        <a name="camel-case"></a>
      </section></section><section>
<h3><a name="Camel_case:_defined"></a>Camel case: defined</h3>
      
<p>Sometimes there is more than one reasonable way to convert an English phrase into camel case,
        such as when acronyms or unusual constructs like &quot;IPv6&quot; or &quot;iOS&quot; are present. To improve
        predictability, Google Style specifies the following (nearly) deterministic scheme.</p>
        
<p>Beginning with the prose form of the name:</p>
        
<ol style="list-style-type: decimal">
          
<li>Convert the phrase to plain ASCII and remove any apostrophes. For example, &quot;M&#xfc;ller's
      algorithm&quot; might become &quot;Muellers algorithm&quot;.</li>
          
<li>Divide this result into words, splitting on spaces and any remaining punctuation (typically
      hyphens).

            
<ul>
              
<li><i>Recommended:</i> if any word already has a conventional camel-case appearance in common
        usage, split this into its constituent parts (e.g., &quot;AdWords&quot; becomes &quot;ad words&quot;). Note
        that a word such as &quot;iOS&quot; is not really in camel case <i>per se</i>; it defies <i>any</i>
        convention, so this recommendation does not apply.</li>
            </ul>
          </li>
          
<li>Now lowercase <i>everything</i> (including acronyms), then uppercase only the first
      character of:
            
<ul>
<li>... each word, to yield <i>upper camel case</i>, or</li>
              
<li>... each word except the first, to yield <i>lower camel case</i></li>
            </ul>
          </li>
          
<li>Finally, join all the words into a single identifier.</li>
        </ol>
        
<p>Note that the casing of the original words is almost entirely disregarded. Examples:</p>
        
<table border="0" class="table table-striped">
          
<tr class="a">
<th>Prose form</th>
<th>Correct</th>
<th>Incorrect</th></tr>
          
<tr class="b">
<td>&quot;XML HTTP request&quot;</td>
<td>XmlHttpRequest</td>
<td>XMLHTTPRequest</td></tr>
          
<tr class="a">
<td>&quot;new customer ID&quot;</td>
<td>newCustomerId</td>
<td>newCustomerID</td></tr>
          
<tr class="b">
<td>&quot;inner stopwatch&quot;</td>
<td>innerStopwatch</td>
<td>innerStopWatch</td></tr>
          
<tr class="a">
<td>&quot;supports IPv6 on iOS?&quot;</td>
<td>supportsIpv6OnIos</td>
<td>supportsIPv6OnIOS</td></tr>
          
<tr class="b">
<td>&quot;YouTube importer&quot;</td>
<td>YouTubeImporter<br />YoutubeImporter*</td>
<td></td></tr>
        </table>
        
<p>*Acceptable, but not recommended.</p>
        
<p><b>Note:</b> Some words are ambiguously hyphenated in the English
      language: for example &quot;nonempty&quot; and &quot;non-empty&quot; are both correct, so the method names
      checkNonempty and
      checkNonEmpty are likewise both correct.</p>
      </section>
      <section>
<h3><a name="Programming_Practices"></a>Programming Practices</h3>
      <a name="programming-practices"></a>
      <a name="override-annotation"></a>
      </section><section>
<h3><a name="a.40Override:_always_used"></a>@Override: always used</h3>
      
<p>A method is marked with the @Override annotation
        whenever it is legal.  This includes a class method overriding a superclass method, a class method
        implementing an interface method, and an interface method respecifying a superinterface
        method.</p>
      
<p class="exception"><b>Exception:</b>@Override may be omitted when the parent method is
      @Deprecated.</p>
      <a name="caughtexceptions"></a>
      <a name="caught-exceptions"></a>
      </section><section>
<h3><a name="Caught_exceptions:_not_ignored"></a>Caught exceptions: not ignored</h3>
      
<p>Except as noted below, it is very rarely correct to do nothing in response to a caught
        exception. (Typical responses are to log it, or if it is considered &quot;impossible&quot;, rethrow it as an
        AssertionError.)</p>
        
<p>When it truly is appropriate to take no action whatsoever in a catch block, the reason this is
      justified is explained in a comment.</p>
<div>
<pre>
      try {
          int i = Integer.parseInt(response);
          return handleNumericResponse(i);
      } catch (NumberFormatException ok) {
          // it's not numeric; that's fine, just continue
      }
      return handleTextResponse(response);
    </pre></div>
<p><b>Exception:</b> In tests, a caught exception may be ignored
      without comment <i>if</i> it is named expected. The
      following is a very common idiom for ensuring that the method under test <i>does</i> throw an
      exception of the expected type, so a comment is unnecessary here.</p>
<div>
<pre>
      try {
          emptyStack.pop();
          fail();
      } catch (NoSuchElementException expected) {
      }
    </pre></div><a name="static-members"></a>
      </section><section>
<h3><a name="Static_members:_qualified_using_class"></a>Static members: qualified using class</h3>
      
<p>When a reference to a static class member must be qualified, it is qualified with that class's
        name, not with a reference or expression of that class's type.</p>
<div>
<pre>
      Foo aFoo = ...;
      Foo.aStaticMethod(); // good
      <span>aFoo.aStaticMethod();</span> // bad
      <span>somethingThatYieldsAFoo().aStaticMethod();</span> // very bad
    </pre></div>
        <a name="finalizers"></a>
      </section><section>
<h3><a name="Finalizers:_not_used"></a>Finalizers: not used</h3>
      
<p>It is <b>extremely rare</b> to override Object.finalize.</p>
      
<p><b>Tip:</b> Don't do it. If you absolutely must, first read and understand
      <a class="externalLink" href="http://books.google.com/books?isbn=8131726592"><i>Effective Java</i></a>
      Item 7, &quot;Avoid Finalizers,&quot; very carefully, and <i>then</i> don't do it.</p>
      </section>
      <a name="javadoc"></a>
      <section>
<h3><a name="Javadoc"></a>Javadoc</h3>
      <a name="javadoc-formatting"></a>
      </section><section>
<h3><a name="Formatting"></a>Formatting</h3>
      <a name="javadoc-multi-line"></a>
      <section>
<h4><a name="General_form"></a>General form</h4>
      
<p>The <i>basic</i> formatting of Javadoc blocks is as seen in this example:</p>
<div>
<pre>
      /**
       * Multiple lines of Javadoc text are written here,
       * wrapped normally...
       */
      public int method(String p1) { ... }
    </pre></div>
<p>... or in this single-line example:</p>
<div>
<pre>
      /** An especially short bit of Javadoc. */
    </pre></div>
<p>The basic form is always acceptable. The single-line form may be substituted when there are no
      at-clauses present, and the entirety of the Javadoc block (including comment markers) can fit on a
      single line.</p>
      <a name="javadoc-paragraphs"></a>
      </section><section>
<h4><a name="Paragraphs"></a>Paragraphs</h4>
      
<p>One blank line&#x2014;that is, a line containing only the aligned leading asterisk
        (*)&#x2014;appears between paragraphs, and before the group of &quot;at-clauses&quot; if
        present. Each paragraph but the first has &lt;p&gt; immediately before the first word,
        with no space after.</p>
      <a name="javadoc-at-clauses"></a>
      </section><section>
<h4><a name="At-clauses"></a>At-clauses</h4>
      
<p>Any of the standard &quot;at-clauses&quot; that are used appear in the order @param,
        @return, @throws, @deprecated, and these four types never
        appear with an empty description. When an at-clause doesn't fit on a single line, continuation lines
        are indented four (or more) spaces from the position of the @.
      </p>
        <a name="summary-fragment"></a>
      </section></section><section>
<h3><a name="The_summary_fragment"></a>The summary fragment</h3>
      
<p>The Javadoc for each class and member begins with a brief <b>summary fragment</b>. This
        fragment is very important: it is the only part of the text that appears in certain contexts such as
        class and method indexes.</p>
<p>This is a fragment&#x2014;a noun phrase or verb phrase, not a complete sentence. It does
      <b>not</b> begin with A {@code Foo} is a..., or
      This method returns..., nor does it form a complete imperative sentence
      like Save the record.. However, the fragment is capitalized and
      punctuated as if it were a complete sentence.</p>
<p class="tip"><b>Tip:</b> A common mistake is to write simple Javadoc in the form
      /** @return the customer ID */. This is incorrect, and should be
      changed to /** Returns the customer ID. */.</p>
      <a name="javadoc-optional"></a>
      <a name="javadoc-where-required"></a>
      </section><section>
<h3><a name="Where_Javadoc_is_used"></a>Where Javadoc is used</h3>
      
<p>At the <i>minimum</i>, Javadoc is present for every
        public class, and every
        public or
        protected member of such a class, with a few exceptions
        noted below.</p>
<p>Other classes and members still have Javadoc <i>as needed</i>.  Whenever an implementation
      comment would be used to define the overall purpose or behavior of a class, method or field, that
      comment is written as Javadoc instead. (It's more uniform, and more tool-friendly.)</p>
      <a name="javadoc-exception-self-explanatory"></a>
      <section>
<h4><a name="Exception:_self-explanatory_methods"></a>Exception: self-explanatory methods</h4>
      
<p>Javadoc is optional for &quot;simple, obvious&quot; methods like
        getFoo, in cases where there <i>really and truly</i> is
        nothing else worthwhile to say but &quot;Returns the foo&quot;.</p>
        
<p class="note"><b>Important:</b> it is not appropriate to cite this exception to justify
      omitting relevant information that a typical reader might need to know. For example, for a method
      named getCanonicalName, don't omit its documentation
      (with the rationale that it would say only
      /** Returns the canonical name. */) if a typical reader may have no idea
      what the term &quot;canonical name&quot; means!</p>
        <a name="javadoc-exception-overrides"></a>
      </section><section>
<h4><a name="Exception:_overrides"></a>Exception: overrides</h4>
      
<p>Javadoc is not always present on a method that overrides a supertype method.
      </p>
      </section></section>
    </section>
  

        </main>
      </div>
    </div>
    <hr/>
    <footer>
      <div class="container-fluid">
        <div class="row-fluid">
<p align="center">Copyright &copy; 1999-2019 <a class="external" href="http://www.apache.org">The Apache Software Foundation</a>. All Rights Reserved.<br>
      Apache Logging, Apache Log4j, Log4j, Apache, the Apache feather logo, and the Apache Logging project logo are trademarks of The Apache Software Foundation.</p>
        </div>
      </div>
    </footer>
  </body>
</html>
