<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!--
   Licensed to the Apache Software Foundation (ASF) under one or more
   contributor license agreements.  See the NOTICE file distributed with
   this work for additional information regarding copyright ownership.
   The ASF licenses this file to You under the Apache License, Version 2.0
   (the "License"); you may not use this file except in compliance with
   the License.  You may obtain a copy of the License at

       http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License.
-->
<!-- Generated by Apache Maven Doxia at 2018-12-02 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <title>Log4j_Audit &#x2013; Java Style Guidelines - Apache Log4j Audit</title>
    <link rel="stylesheet" href="./css/bootstrap.min.css" type="text/css" />
    <link rel="stylesheet" href="./css/site.css" type="text/css" />
    <script type="text/javascript" src="./js/jquery.min.js"></script>
    <script type="text/javascript" src="./js/bootstrap.min.js"></script>
    <script type="text/javascript" src="./js/prettify.min.js"></script>
    <script type="text/javascript" src="./js/site.js"></script>
                    <meta name="Date-Revision-yyyymmdd" content="20181202" />
                <meta http-equiv="Content-Language" content="en" />
        
        </head>
<body class="composite">
<a  href="http://www.apache.org/events/current-event.html">
    <img class=logo-left src="http://www.apache.org/events/current-event-234x60.png"/>
</a>
<img class="logo-right" src="./images/logo.png" alt="Apache log4j logo" />
<a href="https://logging.apache.org/">
    <img class="logo-center" src="./images/ls-logo.jpg" alt="Apache logging services logo" />
</a>
<div class="clear"></div>

<div class="navbar">
    <div class="navbar-inner">
        <div class="container-fluid">
            <a class="brand" href="http://logging.apache.org/log4j-audit">Apache Log4j Audit &trade;</a>
            <ul class="nav">
                        <li>
                        
                
            <a href="https://cwiki.apache.org/confluence/display/LOGGING/Home" class="external" target="_blank" title="Logging Wiki">Logging Wiki</a>
            </li>
                    <li>
                        
                
            <a href="https://www.apache.org/" class="external" target="_blank" title="Apache">Apache</a>
            </li>
                    <li>
                        
                
            <a href="https://logging.apache.org/" class="external" target="_blank" title="Logging Services">Logging Services</a>
            </li>
                    <li>
                        
                
            <a href="https://github.com/apache/logging-log4j-audit" class="external" target="_blank" title="GitHub">GitHub</a>
            </li>
    </ul>
        </div>
    </div>
</div>

<div class="container-fluid">
    <table class="layout-table">
        <tr>
            <td class="sidebar">
                <div class="well sidebar-nav">
                            <ul class="nav nav-list">
                                                        <li class="nav-header"><i class="icon-home"></i>Apache Log4j Audit™</li>
                                                                                    <li class="none">
                                <a href="index.html" title="About">About</a>
                </li>
                                                            <li class="none">
                                <a href="download.html" title="Download">Download</a>
                </li>
                                                            <li class="none">
                                <a href="gettingStarted.html" title="Getting Started">Getting Started</a>
                </li>
                                                            <li class="none">
                                <a href="catalog.html" title="Audit Catalog">Audit Catalog</a>
                </li>
                                                            <li class="none">
                                <a href="requestContext.html" title="RequestContext">RequestContext</a>
                </li>
                                                            <li class="none">
                                <a href="sample.html" title="Sample Project">Sample Project</a>
                </li>
                                                            <li class="none">
                                <a href="changelog.html" title="Changelog">Changelog</a>
                </li>
                                                            <li class="none">
                                <a href="apidocs/index.html" title="Javadoc">Javadoc</a>
                </li>
                            </ul>
        <ul class="nav nav-list">
                                                        <li class="nav-header"><i class="icon-pencil"></i>For Contributors</li>
                                                                                    <li class="none">
                                <a href="build.html" title="Building Log4j Audit from Source">Building Log4j Audit from Source</a>
                </li>
                                                            <li class="none">
                                <a href="guidelines.html" title="Guidelines">Guidelines</a>
                </li>
                                                                <li class="none active">
                                <a href="javastyle.html" title="Style Guide">Style Guide</a>
                </li>
                            </ul>
        <ul class="nav nav-list">
                                                        <li class="nav-header"><i class="icon-cog"></i>Component Reports</li>
                                                                                    <li class="none">
                                <a href="log4j-audit/log4j-audit-api/index.html" title="Audit API">Audit API</a>
                </li>
                                                            <li class="none">
                                <a href="log4j-audit/log4j-audit-war/index.html" title="Audit Service">Audit Service</a>
                </li>
                                                            <li class="none">
                                <a href="log4j-audit/log4j-audit-maven-plugin/index.html" title="Maven Plugin">Maven Plugin</a>
                </li>
                                                            <li class="none">
                                <a href="log4j-catalog/log4j-catalog-api/index.html" title="Catalog API">Catalog API</a>
                </li>
                                                            <li class="none">
                                <a href="log4j-catalog/log4j-catalog-git/index.html" title="Git Catalog Access">Git Catalog Access</a>
                </li>
                                                            <li class="none">
                                <a href="log4j-catalog/log4j-catalog-jpa/index.html" title="JPA Catalog Access">JPA Catalog Access</a>
                </li>
                                                            <li class="none">
                                <a href="log4j-catalog/log4j-catalog-war/index.html" title="Catalog Editor">Catalog Editor</a>
                </li>
                            </ul>
        <ul class="nav nav-list">
                                                        <li class="nav-header"><i class="icon-info-sign"></i>Project Information</li>
                                                                                    <li class="none">
                                <a href="dependency-convergence.html" title="Dependency Convergence">Dependency Convergence</a>
                </li>
                                                            <li class="none">
                                <a href="dependency-management.html" title="Dependency Management">Dependency Management</a>
                </li>
                                                            <li class="none">
                                <a href="team-list.html" title="Project Team">Project Team</a>
                </li>
                                                            <li class="none">
                                <a href="mail-lists.html" title="Mailing Lists">Mailing Lists</a>
                </li>
                                                            <li class="none">
                                <a href="issue-tracking.html" title="Issue Tracking">Issue Tracking</a>
                </li>
                                                            <li class="none">
                                <a href="license.html" title="Project License">Project License</a>
                </li>
                                                            <li class="none">
                                <a href="source-repository.html" title="Source Repository">Source Repository</a>
                </li>
                                                            <li class="none">
                                <a href="project-summary.html" title="Project Summary">Project Summary</a>
                </li>
                            </ul>
        <ul class="nav nav-list">
                                                        <li class="nav-header"><i class="icon-cog"></i>Project Reports</li>
                                                                                    <li class="none">
                                <a href="changes-report.html" title="Changes Report">Changes Report</a>
                </li>
                                                            <li class="none">
                                <a href="jira-report.html" title="JIRA Report">JIRA Report</a>
                </li>
                                                            <li class="none">
                                <a href="rat-report.html" title="RAT Report">RAT Report</a>
                </li>
                            </ul>
                    </div>
                <div id="poweredBy">
                                                <a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
            <img class="poweredBy" alt="Built by Maven" src="./images/maven-feather.png" />
        </a>
                            </div>
            </td>
            <td class="content">
                <!-- Licensed to the Apache Software Foundation (ASF) under one or more
 contributor license agreements. See the NOTICE file distributed with
 this work for additional information regarding copyright ownership.
 The ASF licenses this file to You under the Apache License, Version 2.0
 (the "License"); you may not use this file except in compliance with
 the License. You may obtain a copy of the License at

         http://www.apache.org/licenses/LICENSE-2.0

 Unless required by applicable law or agreed to in writing, software
 distributed under the License is distributed on an "AS IS" BASIS,
 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 See the License for the specific language governing permissions and
 limitations under the License. -->

  
    <div class="section">
<h2><a name="Apache_Log4j_Code_Style_Guidelines"></a>Apache Log4j Code Style Guidelines</h2>
      <a name="intro"></a>
      
<div class="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>
      </div>
<div class="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 (<tt>@interface</tt>).</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>
      </div>
<div class="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>
      </div>
      <a name="source-file-basics"></a>
      
<div class="section">
<h3><a name="Source_File_Basics"></a>Source File Basics</h3>
      <a name="file-name"></a>
      </div>
<div class="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 <tt>.java</tt> extension.</p>
      <a name="file-encoding"></a>
      </div>
<div class="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>
      </div>
<div class="section">
<h3><a name="Special_characters"></a>Special characters</h3>
      <a name="whitespace-characters"></a>
      
<div class="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>
      </div>
<div class="section">
<h4><a name="Special_escape_sequences"></a>Special escape sequences</h4>
      
<p>For any character that has a special escape sequence
        (<tt>\b</tt>,
        <tt>\t</tt>,
        <tt>\n</tt>,
        <tt>\f</tt>,
        <tt>\r</tt>,
        <tt>\&quot;</tt>,
        <tt>\'</tt> and
        <tt>\\</tt>), that sequence is used rather than the corresponding octal
        (e.g. <tt>\012</tt>) or Unicode (e.g. <tt>\u000a</tt>) escape.</p>
      <a name="non-ascii-characters"></a>
      </div>
<div class="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. <tt>&#x221e;</tt>) or the equivalent Unicode escape (e.g. <tt>\u221e</tt>) 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="bodyTable">
            
<tr class="a">
<th>Example</th>
<th>Discussion</th></tr>
            
<tr class="b">
<td><tt>String unitAbbrev = &quot;&#x3bc;s&quot;;</tt></td>
<td>Best: perfectly clear even without a comment.</td></tr>
            
<tr class="a">
<td><tt>String unitAbbrev = &quot;\u03bcs&quot;; // &quot;&#x3bc;s&quot;</tt></td>
<td>Allowed, but there's no reason to do this.</td></tr>
            
<tr class="b">
<td><tt>String unitAbbrev = &quot;\u03bcs&quot;; // Greek letter mu, &quot;s&quot;</tt></td>
<td>Allowed, but awkward and prone to mistakes.</td></tr>
            
<tr class="a">
<td><tt>String unitAbbrev = &quot;\u03bcs&quot;;</tt></td>
<td>Poor: the reader has no idea what this is.</td></tr>
            
<tr class="b">
<td><tt>return '\ufeff' + content; // byte order mark</tt></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>
      </div></div>
      <a name="filestructure"></a>
      <a name="source-file-structure"></a>
      
<div class="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>
      </div>
<div class="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>
      </div>
<div class="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>
      </div>
<div class="section">
<h3><a name="Import_statements"></a>Import statements</h3>
      <a name="wildcard-imports"></a>
      
<div class="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>
      </div>
<div class="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>
      </div>
<div class="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>
      </div>
<div class="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
      <tt>src/ide</tt>. For example:</p>
      
<ul>
        
<li>Eclipse: <tt>src/ide/eclipse/4.3.2/organize-imports.importorder</tt></li>
        
<li>IntelliJ: <tt>src/ide/Intellij/13/IntellijSettings.jar</tt></li>
      </ul>
      <a name="class-declaration"></a>
      </div></div>
<div class="section">
<h3><a name="Class_declaration"></a>Class declaration</h3>
      <a name="oneclassperfile"></a>
      <a name="one-top-level-class"></a>
      
<div class="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>
      </div>
<div class="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>
      
<div class="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>
      </div></div></div>
      <a name="formatting"></a>
      
<div class="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>
      </div>
<div class="section">
<h3><a name="Braces"></a>Braces</h3>
      <a name="braces-always-used"></a>
      
<div class="section">
<h4><a name="Braces_are_used_where_optional"></a>Braces are used where optional</h4>
      
<p>Braces are used with
        <tt>if</tt>,
        <tt>else</tt>,
        <tt>for</tt>,
        <tt>do</tt> and
        <tt>while</tt> statements, even when the
        body is empty or contains only a single statement.</p>
      <a name="blocks-k-r-style"></a>
      </div>
<div class="section">
<h4><a name="Nonempty_blocks:_K__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 <tt>else</tt> 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>
      </div>
<div class="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
        (<tt>{}</tt>), <b>unless</b> it is part of a
        <i>multi-block statement</i> (one that directly contains multiple blocks:
        <tt>if/else-if/else</tt> or
        <tt>try/catch/finally</tt>).</p>
        
<p>Example:</p>
<div>
<pre>
      void doNothing() {}
    </pre></div><a name="block-indentation"></a>
      </div></div>
<div class="section">
<h3><a name="Block_indentation:_4_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>
      </div>
<div class="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>
      </div>
<div class="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><tt>package</tt> and <tt>import</tt> 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>
      </div>
<div class="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>
      
<div class="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
        (<tt>.</tt>), the ampersand in type bounds
        (<tt>&lt;T extends Foo &amp; Bar&gt;</tt>), and the pipe in
        catch blocks
        (<tt>catch (FooException | BarException e)</tt>).</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
        <tt>for</tt> (&quot;foreach&quot;) statement.</li>
            </ul>
          </li>
          
<li>A method or constructor name stays attached to the open parenthesis
      (<tt>(</tt>) that follows it.</li>
          
<li>A comma (<tt>,</tt>) stays attached to the token that
      precedes it.</li>
        </ol>
        <a name="indentation"></a>
        <a name="line-wrapping-indent"></a>
      </div>
<div class="section">
<h4><a name="Indent_continuation_lines_at_least_8_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>
      </div></div>
<div class="section">
<h3><a name="Whitespace"></a>Whitespace</h3>
      <a name="vertical-whitespace"></a>
      
<div class="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>
      </div>
<div class="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
      <tt>if</tt>,
      <tt>for</tt> or
      <tt>catch</tt>, from an open parenthesis
      (<tt>(</tt>)
      that follows it on that line</li>
          
<li>Separating any reserved word, such as
      <tt>else</tt> or
      <tt>catch</tt>, from a closing curly brace
      (<tt>}</tt>) that precedes it on that line</li>
          
<li>Before any open curly brace
      (<tt>{</tt>), with two exceptions:
            
<ul>
              
<li><tt>String[][] x = {{&quot;foo&quot;}};</tt> (no space is required
        between <tt>{{</tt>, 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:
        <tt>&lt;T extends Foo &amp; Bar&gt;</tt></li>
              
<li>the pipe for a catch block that handles multiple exceptions:
        <tt>catch (FooException | BarException e)</tt></li>
              
<li>the colon (<tt>:</tt>) in an enhanced
        <tt>for</tt> (&quot;foreach&quot;) statement</li>
            </ul>
          </li>
          
<li>After <tt>,:;</tt> or the closing parenthesis
      (<tt>)</tt>) of a cast</li>
          
<li>On both sides of the double slash (<tt>//</tt>) 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:
      <tt>List&lt;String&gt; list</tt></li>
          
<li><i>Optional</i> just inside both braces of an array initializer
            
<ul>
              
<li><tt>new int[] {5, 6}</tt> and
        <tt>new int[] { 5, 6 }</tt> 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>
      </div>
<div class="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>
      </div></div>
<div class="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>
      </div>
<div class="section">
<h3><a name="Specific_constructs"></a>Specific constructs</h3>
      <a name="enum-classes"></a>
      
<div class="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>
      </div>
<div class="section">
<h4><a name="Variable_declarations"></a>Variable declarations</h4>
      <a name="variables-per-declaration"></a>
      
<div class="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
        <tt>int a, b;</tt> are not used.</p>
        <a name="variables-limited-scope"></a>
      </div>
<div class="section">
<h5><a name="Declared_when_needed_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>
      </div></div>
<div class="section">
<h4><a name="Arrays"></a>Arrays</h4>
      <a name="array-initializers"></a>
      
<div class="section">
<h5><a name="Array_initializers:_can_be_block-like"></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>
      </div>
<div class="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:
        <tt>String[] args</tt>, not
        <tt>String args[]</tt>.</p>
        <a name="switch"></a>
      </div></div>
<div class="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 <tt>case FOO:</tt> or
        <tt>default:</tt>), followed by one or more statements.</p>
        <a name="switch-indentation"></a>
      
<div class="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>
      </div>
<div class="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
        <tt>break</tt>,
        <tt>continue</tt>,
        <tt>return</tt> 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
        <tt>// fall through</tt>). 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>
      </div>
<div class="section">
<h5><a name="The_default_case_is_present"></a>The default case is present</h5>
      
<p>Each switch statement includes a <tt>default</tt> statement
        group, even if it contains no code.</p>
        <a name="annotations"></a>
      </div></div>
<div class="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>
      </div>
<div class="section">
<h4><a name="Comments"></a>Comments</h4>
      <a name="block-comment-style"></a>
      
<div class="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
        <tt>/* ... */</tt> style or
        <tt>// ...</tt> style. For multi-line
        <tt>/* ... */</tt> comments, subsequent lines must start with
        <tt>*</tt> aligned with the <tt>*</tt> 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
      <tt>/* ... */</tt> style if you want automatic code formatters to
      re-wrap the lines when necessary (paragraph-style). Most formatters don't re-wrap lines in
      <tt>// ...</tt> style comment blocks.</p>
        <a name="modifiers"></a>
      </div></div>
<div class="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>
      </div>
<div class="section">
<h4><a name="Numeric_Literals"></a>Numeric Literals</h4>
      
<p><tt>long</tt>-valued integer literals use an uppercase <tt>L</tt> suffix, never
        lowercase (to avoid confusion with the digit <tt>1</tt>). For example, <tt>3000000000L</tt>
        rather than <tt>3000000000l</tt>.</p>
      </div></div>
      <a name="naming"></a>
      
<div class="section">
<h3><a name="Naming"></a>Naming</h3>
      <a name="identifier-names"></a>
      </div>
<div class="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 <tt>\w+</tt> .</p>
        
<p> In Google Style special prefixes or
      suffixes, like those seen in the examples <tt>name_</tt>,
      <tt>mName</tt>, <tt>s_name</tt> and
      <tt>kName</tt>, are <b>not</b> used.</p>
        <a name="specific-identifier-names"></a>
      </div>
<div class="section">
<h3><a name="Rules_by_identifier_type"></a>Rules by identifier type</h3>
      <a name="package-names"></a>
      
<div class="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, <tt>com.example.deepspace</tt>, not
        <tt>com.example.deepSpace</tt> or
        <tt>com.example.deep_space</tt>.</p>
        <a name="class-names"></a>
      </div>
<div class="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,
      <tt>Character</tt> or
      <tt>ImmutableList</tt>. Interface names may also be nouns or
      noun phrases (for example, <tt>List</tt>), but may sometimes be
      adjectives or adjective phrases instead (for example,
      <tt>Readable</tt>).</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 <tt>Test</tt>. For example,
      <tt>HashTest</tt> or
      <tt>HashIntegrationTest</tt>.</p>
        <a name="method-names"></a>
      </div>
<div class="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,
      <tt>sendMessage</tt> or
      <tt>stop</tt>.</p>
<p>Underscores may appear in JUnit <i>test</i> method names to separate logical components of the
      name. One typical pattern is <tt>test<i>&lt;MethodUnderTest&gt;</i>_<i>&lt;state&gt;</i></tt>,
      for example <tt>testPop_emptyStack</tt>. There is no One Correct
      Way to name test methods.</p>
        <a name="constants"></a>
        <a name="constant-names"></a>
      </div>
<div class="section">
<h4><a name="Constant_names"></a>Constant names</h4>
      
<p>Constant names use <tt>CONSTANT_CASE</tt>: 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>
      </div>
<div class="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,
      <tt>computedValues</tt> or
      <tt>index</tt>.</p>
        <a name="parameter-names"></a>
      </div>
<div class="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>
      </div>
<div class="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>
      </div>
<div class="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
      <tt>E</tt>, <tt>T</tt>,
      <tt>X</tt>, <tt>T2</tt>)
    </li>
<li>A name in the form used for classes (see
      <a href="#class-names">Class names</a>), followed by the capital letter
      <tt>T</tt> (examples:
      <tt>RequestT</tt>,
      <tt>FooBarT</tt>).</li></ul><a name="acronyms"></a>
        <a name="camelcase"></a>
        <a name="camel-case"></a>
      </div></div>
<div class="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="bodyTable">
          
<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><tt>XmlHttpRequest</tt></td>
<td><tt>XMLHTTPRequest</tt></td></tr>
          
<tr class="a">
<td>&quot;new customer ID&quot;</td>
<td><tt>newCustomerId</tt></td>
<td><tt>newCustomerID</tt></td></tr>
          
<tr class="b">
<td>&quot;inner stopwatch&quot;</td>
<td><tt>innerStopwatch</tt></td>
<td><tt>innerStopWatch</tt></td></tr>
          
<tr class="a">
<td>&quot;supports IPv6 on iOS?&quot;</td>
<td><tt>supportsIpv6OnIos</tt></td>
<td><tt>supportsIPv6OnIOS</tt></td></tr>
          
<tr class="b">
<td>&quot;YouTube importer&quot;</td>
<td><tt>YouTubeImporter</tt><br /><tt>YoutubeImporter</tt>*</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
      <tt>checkNonempty</tt> and
      <tt>checkNonEmpty</tt> are likewise both correct.</p>
      </div>
      
<div class="section">
<h3><a name="Programming_Practices"></a>Programming Practices</h3>
      <a name="programming-practices"></a>
      <a name="override-annotation"></a>
      </div>
<div class="section">
<h3><a name="aOverride:_always_used"></a>@Override: always used</h3>
      
<p>A method is marked with the <tt>@Override</tt> 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><tt>@Override</tt> may be omitted when the parent method is
      <tt>@Deprecated</tt>.</p>
      <a name="caughtexceptions"></a>
      <a name="caught-exceptions"></a>
      </div>
<div class="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
        <tt>AssertionError</tt>.)</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 <tt>expected</tt>. 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>
      </div>
<div class="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>
      </div>
<div class="section">
<h3><a name="Finalizers:_not_used"></a>Finalizers: not used</h3>
      
<p>It is <b>extremely rare</b> to override <tt>Object.finalize</tt>.</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>
      </div>
      <a name="javadoc"></a>
      
<div class="section">
<h3><a name="Javadoc"></a>Javadoc</h3>
      <a name="javadoc-formatting"></a>
      </div>
<div class="section">
<h3><a name="Formatting"></a>Formatting</h3>
      <a name="javadoc-multi-line"></a>
      
<div class="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>
      </div>
<div class="section">
<h4><a name="Paragraphs"></a>Paragraphs</h4>
      
<p>One blank line&#x2014;that is, a line containing only the aligned leading asterisk
        (<tt>*</tt>)&#x2014;appears between paragraphs, and before the group of &quot;at-clauses&quot; if
        present. Each paragraph but the first has <tt>&lt;p&gt;</tt> immediately before the first word,
        with no space after.</p>
      <a name="javadoc-at-clauses"></a>
      </div>
<div class="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 <tt>@param</tt>,
        <tt>@return</tt>, <tt>@throws</tt>, <tt>@deprecated</tt>, 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 <tt>@</tt>.
      </p>
        <a name="summary-fragment"></a>
      </div></div>
<div class="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 <tt>A {@code Foo} is a...</tt>, or
      <tt>This method returns...</tt>, nor does it form a complete imperative sentence
      like <tt>Save the record.</tt>. 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
      <tt>/** @return the customer ID */</tt>. This is incorrect, and should be
      changed to <tt>/** Returns the customer ID. */</tt>.</p>
      <a name="javadoc-optional"></a>
      <a name="javadoc-where-required"></a>
      </div>
<div class="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
        <tt>public</tt> class, and every
        <tt>public</tt> or
        <tt>protected</tt> 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>
      
<div class="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
        <tt>getFoo</tt>, 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 <tt>getCanonicalName</tt>, don't omit its documentation
      (with the rationale that it would say only
      <tt>/** Returns the canonical name. */</tt>) if a typical reader may have no idea
      what the term &quot;canonical name&quot; means!</p>
        <a name="javadoc-exception-overrides"></a>
      </div>
<div class="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>
      </div></div>
    </div>
  

            </td>
        </tr>
    </table>
</div>

<div class="footer">
        <p>Copyright &copy; 2016-2018 <a class="external" href="http://www.apache.org">Apache Software Foundation</a>. All Rights Reserved.</p>
    <p>Apache Logging, Apache Log4j, Log4j, Apache Log4j Audit, Log4j Audit, Apache, the Apache feather logo, and the Apache Logging project logo are trademarks of The Apache Software Foundation.</p>
    <p>Site powered by <a class="external" href="http://getbootstrap.com/">Twitter Bootstrap</a>. Icons from <a class="external" href="http://glyphicons.com/">Glyphicons Free</a>.</p>
</div>
</div>
</body>
</html>
