page.title=Code Style for Contributors
@jd:body

<!--
    Copyright 2015 The Android Open Source Project

    Licensed 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 id="qv-wrapper">
  <div id="qv">
    <h2>In this document</h2>
    <ol id="auto-toc">
    </ol>
  </div>
</div>

<p>The code styles below are strict rules, not guidelines or recommendations.
Contributions to Android that do not adhere to these rules are generally <em>not
accepted</em>. We recognize that not all existing code follows these rules, but
we expect all new code to be compliant.</p>

<h2 id="java-language-rules">Java Language Rules</h2>
<p>Android follows standard Java coding conventions with the additional rules
described below.</p>

<h3 id="dont-ignore-exceptions">Don't Ignore Exceptions</h3>
<p>It can be tempting to write code that completely ignores an exception, such
as:</p>
<pre><code>void setServerPort(String value) {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) { }
}
</code></pre>
<p>Do not do this. While you may think your code will never encounter this error
condition or that it is not important to handle it, ignoring exceptions as above
creates mines in your code for someone else to trigger some day. You must handle
every Exception in your code in a principled way; the specific handling varies
depending on the case.</p>
<p><em>Anytime somebody has an empty catch clause they should have a
creepy feeling. There are definitely times when it is actually the correct
thing to do, but at least you have to think about it. In Java you can't escape
the creepy feeling.</em> -<a href="http://www.artima.com/intv/solid4.html">James Gosling</a></p>
<p>Acceptable alternatives (in order of preference) are:</p>
<ul>
<li>Throw the exception up to the caller of your method.
<pre><code>void setServerPort(String value) throws NumberFormatException {
    serverPort = Integer.parseInt(value);
}
</code></pre>
</li>
<li>Throw a new exception that's appropriate to your level of abstraction.
<pre><code>void setServerPort(String value) throws ConfigurationException {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) {
        throw new ConfigurationException("Port " + value + " is not valid.");
    }
}
</code></pre>
</li>
<li>Handle the error gracefully and substitute an appropriate value in the
catch {} block.
<pre><code>/** Set port. If value is not a valid number, 80 is substituted. */

void setServerPort(String value) {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) {
        serverPort = 80;  // default port for server
    }
}
</code></pre>
</li>
<li>Catch the Exception and throw a new <code>RuntimeException</code>. This is
dangerous, so do it only if you are positive that if this error occurs the
appropriate thing to do is crash.
<pre><code>/** Set port. If value is not a valid number, die. */

void setServerPort(String value) {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) {
        throw new RuntimeException("port " + value " is invalid, ", e);
    }
}
</code></pre>
<p class="note"><strong>Note</strong> The original exception is passed to the
constructor for RuntimeException. If your code must compile under Java 1.3, you
must omit the exception that is the cause.</p>
</li>
<li>As a last resort, if you are confident that ignoring the exception is
appropriate then you may ignore it, but you must also comment why with a good
reason:
<pre><code>/** If value is not a valid number, original port number is used. */
void setServerPort(String value) {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) {
        // Method is documented to just ignore invalid user input.
        // serverPort will just be unchanged.
    }
}
</code></pre>
</li>
</ul>

<h3 id="dont-catch-generic-exception">Don't Catch Generic Exception</h3>
<p>It can also be tempting to be lazy when catching exceptions and do
something like this:</p>
<pre><code>try {
    someComplicatedIOFunction();        // may throw IOException
    someComplicatedParsingFunction();   // may throw ParsingException
    someComplicatedSecurityFunction();  // may throw SecurityException
    // phew, made it all the way
} catch (Exception e) {                 // I'll just catch all exceptions
    handleError();                      // with one generic handler!
}
</code></pre>
<p>Do not do this. In almost all cases it is inappropriate to catch generic
Exception or Throwable (preferably not Throwable because it includes Error
exceptions). It is very dangerous because it means that Exceptions
you never expected (including RuntimeExceptions like ClassCastException) get
caught in application-level error handling. It obscures the failure handling
properties of your code, meaning if someone adds a new type of Exception in the
code you're calling, the compiler won't help you realize you need to handle the
error differently. In most cases you shouldn't be handling different types of
exception the same way.</p>
<p>The rare exception to this rule is test code and top-level code where you
want to catch all kinds of errors (to prevent them from showing up in a UI, or
to keep a batch job running). In these cases you may catch generic Exception
(or Throwable) and handle the error appropriately. Think very carefully before
doing this, though, and put in comments explaining why it is safe in this place.</p>
<p>Alternatives to catching generic Exception:</p>
<ul>
<li>
<p>Catch each exception separately as separate catch blocks after a single
try. This can be awkward but is still preferable to catching all Exceptions.
Beware repeating too much code in the catch blocks.</li></p>
</li>
<li>
<p>Refactor your code to have more fine-grained error handling, with multiple
try blocks. Split up the IO from the parsing, handle errors separately in each
case.</p>
</li>
<li>
<p>Rethrow the exception. Many times you don't need to catch the exception at
this level anyway, just let the method throw it.</p>
</li>
</ul>
<p>Remember: exceptions are your friend! When the compiler complains you're
not catching an exception, don't scowl. Smile: the compiler just made it
easier for you to catch runtime problems in your code.</p>
<h3 id="dont-use-finalizers">Don't Use Finalizers</h3>
<p>Finalizers are a way to have a chunk of code executed when an object is
garbage collected. While they can be handy for doing cleanup (particularly of
external resources, there are no guarantees as to when a finalizer will be
called (or even that it will be called at all).</p>
<p>Android doesn't use finalizers. In most cases, you can do what
you need from a finalizer with good exception handling. If you absolutely need
it, define a close() method (or the like) and document exactly when that
method needs to be called (see InputStream for an example). In this case it is
appropriate but not required to print a short log message from the finalizer,
as long as it is not expected to flood the logs.</p>

<h3 id="fully-qualify-imports">Fully Qualify Imports</h3>
<p>When you want to use class Bar from package foo,there
are two possible ways to import it:</p>
<ul>
<li><code>import foo.*;</code>
<p>Potentially reduces the number of import statements.</p></li>
<li><code>import foo.Bar;</code>
<p>Makes it obvious what classes are actually used and the code is more readable
for maintainers.</p></li></ul>
<p>Use <code>import foo.Bar;</code> for importing all Android code. An explicit
exception is made for java standard libraries (<code>java.util.*</code>,
<code>java.io.*</code>, etc.) and unit test code
(<code>junit.framework.*</code>).</p>

<h2 id="java-library-rules">Java Library Rules</h2>
<p>There are conventions for using Android's Java libraries and tools. In some
cases, the convention has changed in important ways and older code might use a
deprecated pattern or library. When working with such code, it's okay to
continue the existing style. When creating new components however, never use
deprecated libraries.</p>

<h2 id="java-style-rules">Java Style Rules</h2>

<h3 id="use-javadoc-standard-comments">Use Javadoc Standard Comments</h3>
<p>Every file should have a copyright statement at the top, followed by package
and import statements (each block separated by a blank line) and finally the
class or interface declaration. In the Javadoc comments, describe what the class
or interface does.</p>
<pre><code>/*
 * Copyright (C) 2015 The Android Open Source Project
 *
 * Licensed 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.
 */

package com.android.internal.foo;

import android.os.Blah;
import android.view.Yada;

import java.sql.ResultSet;
import java.sql.SQLException;

/**
 * Does X and Y and provides an abstraction for Z.
 */

public class Foo {
    ...
}
</code></pre>
<p>Every class and nontrivial public method you write <em>must</em> contain a
Javadoc comment with at least one sentence describing what the class or method
does. This sentence should start with a third person descriptive verb.</p>
<p>Examples:</p>
<pre><code>/** Returns the correctly rounded positive square root of a double value. */
static double sqrt(double a) {
    ...
}
</code></pre>
<p>or</p>
<pre><code>/**
 * Constructs a new String by converting the specified array of
 * bytes using the platform's default character encoding.
 */
public String(byte[] bytes) {
    ...
}
</code></pre>
<p>You do not need to write Javadoc for trivial get and set methods such as
<code>setFoo()</code> if all your Javadoc would say is "sets Foo". If the method
does something more complex (such as enforcing a constraint or has an important
side effect), then you must document it. If it's not obvious what the property
"Foo" means, you should document it.
<p>Every method you write, public or otherwise, would benefit from Javadoc.
Public methods are part of an API and therefore require Javadoc. Android does
not currently enforce a specific style for writing Javadoc comments, but you
should follow the instructions <a
href="http://www.oracle.com/technetwork/java/javase/documentation/index-137868.html">How
to Write Doc Comments for the Javadoc Tool</a>.</p>

<h3 id="write-short-methods">Write Short Methods</h3>
<p>When feasible, keep methods small and focused. We recognize that long methods
are sometimes appropriate, so no hard limit is placed on method length. If a
method exceeds 40 lines or so, think about whether it can be broken up without
harming the structure of the program.</p>

<h3 id="define-fields-in-standard-places">Define Fields in Standard Places</h3>
<p>Define fields either at the top of the file or immediately before the
methods that use them.</p>

<h3 id="limit-variable-scope">Limit Variable Scope</h3>
<p>Keep the scope of local variables to a minimum. By doing so, you
increase the readability and maintainability of your code and reduce the
likelihood of error. Each variable should be declared in the innermost block
that encloses all uses of the variable.</p>
<p>Local variables should be declared at the point they are first used. Nearly
every local variable declaration should contain an initializer. If you don't
yet have enough information to initialize a variable sensibly, postpone the
declaration until you do.</p>
<p>The exception is try-catch statements. If a variable is initialized with the
return value of a method that throws a checked exception, it must be initialized
inside a try block. If the value must be used outside of the try block, then it
must be declared before the try block, where it cannot yet be sensibly
initialized:</p>
<pre><code>// Instantiate class cl, which represents some sort of Set
Set s = null;
try {
    s = (Set) cl.newInstance();
} catch(IllegalAccessException e) {
    throw new IllegalArgumentException(cl + " not accessible");
} catch(InstantiationException e) {
    throw new IllegalArgumentException(cl + " not instantiable");
}

// Exercise the set
s.addAll(Arrays.asList(args));
</code></pre>
<p>However, even this case can be avoided by encapsulating the try-catch block
in a method:</p>
<pre><code>Set createSet(Class cl) {
    // Instantiate class cl, which represents some sort of Set
    try {
        return (Set) cl.newInstance();
    } catch(IllegalAccessException e) {
        throw new IllegalArgumentException(cl + " not accessible");
    } catch(InstantiationException e) {
        throw new IllegalArgumentException(cl + " not instantiable");
    }
}

...

// Exercise the set
Set s = createSet(cl);
s.addAll(Arrays.asList(args));
</code></pre>
<p>Loop variables should be declared in the for statement itself unless there
is a compelling reason to do otherwise:</p>
<pre><code>for (int i = 0; i < n; i++) {
    doSomething(i);
}
</code></pre>
<p>and</p>
<pre><code>for (Iterator i = c.iterator(); i.hasNext(); ) {
    doSomethingElse(i.next());
}
</code></pre>

<h3 id="order-import-statements">Order Import Statements</h3>
<p>The ordering of import statements is:</p>
<ol>
<li>
<p>Android imports</p>
</li>
<li>
<p>Imports from third parties (<code>com</code>, <code>junit</code>,
<code>net</code>, <code>org</code>)</p>
</li>
<li>
<p><code>java</code> and <code>javax</code></p>
</li>
</ol>
<p>To exactly match the IDE settings, the imports should be:</p>
<ul>
<li>
<p>Alphabetical within each grouping, with capital letters before lower case
letters (e.g. Z before a).</p>
</li>
<li>
<p>Separated by a blank line between each major grouping (<code>android</code>,
<code>com</code>, <code>junit</code>, <code>net</code>, <code>org</code>,
<code>java</code>, <code>javax</code>).</p>
</li>
</ul>
<p>Originally, there was no style requirement on the ordering, meaning IDEs were
either always changing the ordering or IDE developers had to disable the
automatic import management features and manually maintain the imports. This was
deemed bad. When java-style was asked, the preferred styles varied wildly and it
came down to Android needing to simply "pick an ordering and be consistent." So
we chose a style, updated the style guide, and made the IDEs obey it. We expect
that as IDE users work on the code, imports in all packages will match this
pattern without extra engineering effort.</p>
<p>This style was chosen such that:</p>
<ul>
<li>
<p>The imports people want to look at first tend to be at the top
(<code>android</code>).</p>
</li>
<li>
<p>The imports people want to look at least tend to be at the bottom
(<code>java</code>).</p>
</li>
<li>
<p>Humans can easily follow the style.</p>
</li>
<li>
<p>IDEs can follow the style.</p>
</li>
</ul>
<p>The use and location of static imports have been mildly controversial
issues. Some people prefer static imports to be interspersed with the
remaining imports, while some prefer them to reside above or below all
other imports. Additionally, we have not yet determined how to make all IDEs use
the same ordering. Since many consider this a low priority issue, just use your
judgement and be consistent.</p>

<h3 id="use-spaces-for-indentation">Use Spaces for Indentation</h3>
<p>We use four (4) space indents for blocks and never tabs. When in doubt, be
consistent with the surrounding code.</p>
<p>We use eight (8) space indents for line wraps, including function calls and
assignments. For example, this is correct:</p>
<pre><code>Instrument i =
        someLongExpression(that, wouldNotFit, on, one, line);
</code></pre>
<p>and this is not correct:</p>
<pre><code>Instrument i =
    someLongExpression(that, wouldNotFit, on, one, line);
</code></pre>

<h3 id="follow-field-naming-conventions">Follow Field Naming Conventions</h3>
<ul>
<li>
<p>Non-public, non-static field names start with m.</p>
</li>
<li>
<p>Static field names start with s.</p>
</li>
<li>
<p>Other fields start with a lower case letter.</p>
</li>
<li>
<p>Public static final fields (constants) are ALL_CAPS_WITH_UNDERSCORES.</p>
</li>
</ul>
<p>For example:</p>
<pre><code>public class MyClass {
    public static final int SOME_CONSTANT = 42;
    public int publicField;
    private static MyClass sSingleton;
    int mPackagePrivate;
    private int mPrivate;
    protected int mProtected;
}
</code></pre>
<h3 id="use-standard-brace-style">Use Standard Brace Style</h3>
<p>Braces do not go on their own line; they go on the same line as the code
before them:</p>
<pre><code>class MyClass {
    int func() {
        if (something) {
            // ...
        } else if (somethingElse) {
            // ...
        } else {
            // ...
        }
    }
}
</code></pre>
<p>We require braces around the statements for a conditional. Exception: If the
entire conditional (the condition and the body) fit on one line, you may (but
are not obligated to) put it all on one line. For example, this is acceptable:</p>
<pre><code>if (condition) {
    body();
}
</code></pre>
<p>and this is acceptable:</p>
<pre><code>if (condition) body();
</code></pre>
<p>but this is not acceptable:</p>
<pre><code>if (condition)
    body();  // bad!
</code></pre>

<h3 id="limit-line-length">Limit Line Length</h3>
<p>Each line of text in your code should be at most 100 characters long. While
much discussion has surrounded this rule, the decision remains that 100
characters is the maximum <em>with the following exceptions</em>:</p>
<ul>
<li>If a comment line contains an example command or a literal URL
longer than 100 characters, that line may be longer than 100 characters for
ease of cut and paste.</li>
<li>Import lines can go over the limit because humans rarely see them (this also
simplifies tool writing).</li>
</ul>

<h3 id="use-standard-java-annotations">Use Standard Java Annotations</h3>
<p>Annotations should precede other modifiers for the same language element.
Simple marker annotations (e.g. @Override) can be listed on the same line with
the language element. If there are multiple annotations, or parameterized
annotations, they should each be listed one-per-line in alphabetical
order.</p>
<p>Android standard practices for the three predefined annotations in Java are:</p>
<ul>
<li><code>@Deprecated</code>: The @Deprecated annotation must be used whenever
the use of the annotated element is discouraged. If you use the @Deprecated
annotation, you must also have a @deprecated Javadoc tag and it should name an
alternate implementation. In addition, remember that a @Deprecated method is
<em>still supposed to work</em>. If you see old code that has a @deprecated
Javadoc tag, please add the @Deprecated annotation.
</li>
<li><code>@Override</code>: The @Override annotation must be used whenever a
method overrides the declaration or implementation from a super-class. For
example, if you use the @inheritdocs Javadoc tag, and derive from a class (not
an interface), you must also annotate that the method @Overrides the parent
class's method.</li>
<li><code>@SuppressWarnings</code>: The @SuppressWarnings annotation should be
used only under circumstances where it is impossible to eliminate a warning. If
a warning passes this "impossible to eliminate" test, the @SuppressWarnings
annotation <em>must</em> be used, so as to ensure that all warnings reflect
actual problems in the code.
<p>When a @SuppressWarnings annotation is necessary, it must be prefixed with
a TODO comment that explains the "impossible to eliminate" condition. This
will normally identify an offending class that has an awkward interface. For
example:</p>
<pre><code>// TODO: The third-party class com.third.useful.Utility.rotate() needs generics
&#64;SuppressWarnings("generic-cast")
List&lt;String&gt; blix = Utility.rotate(blax);
</code></pre>
<p>When a @SuppressWarnings annotation is required, the code should be
refactored to isolate the software elements where the annotation applies.</p>
</li>
</ul>

<h3 id="treat-acronyms-as-words">Treat Acronyms as Words</h3>
<p>Treat acronyms and abbreviations as words in naming variables, methods, and
classes to make names more readable:</p>
<table>
<thead>
<tr>
<th>Good</th>
<th>Bad</th>
</tr>
</thead>
<tbody>
<tr>
<td>XmlHttpRequest</td>
<td>XMLHTTPRequest</td>
</tr>
<tr>
<td>getCustomerId</td>
<td>getCustomerID</td>
</tr>
<tr>
<td>class Html</td>
<td>class HTML</td>
</tr>
<tr>
<td>String url</td>
<td>String URL</td>
</tr>
<tr>
<td>long id</td>
<td>long ID</td>
</tr>
</tbody>
</table>
<p>As both the JDK and the Android code bases are very inconsistent around
acronyms, it is virtually impossible to be consistent with the surrounding
code. Therefore, always treat acronyms as words.</p>

<h3 id="use-todo-comments">Use TODO Comments</h3>
<p>Use TODO comments for code that is temporary, a short-term solution, or
good-enough but not perfect. TODOs should include the string TODO in all caps,
followed by a colon:</p>
<pre><code>// TODO: Remove this code after the UrlTable2 has been checked in.
</code></pre>
<p>and</p>
<pre><code>// TODO: Change this to use a flag instead of a constant.
</code></pre>
<p>If your TODO is of the form "At a future date do something" make sure that
you either include a very specific date ("Fix by November 2005") or a very
specific event ("Remove this code after all production mixers understand
protocol V7.").</p>

<h3 id="log-sparingly">Log Sparingly</h3>
<p>While logging is necessary, it has a significantly negative impact on
performance and quickly loses its usefulness if not kept reasonably
terse. The logging facilities provides five different levels of logging:</p>
<ul>
<li><code>ERROR</code>:
Use when something fatal has happened, i.e. something will have user-visible
consequences and won't be recoverable without explicitly deleting some data,
uninstalling applications, wiping the data partitions or reflashing the entire
device (or worse). This level is always logged. Issues that justify some logging
at the ERROR level are typically good candidates to be reported to a
statistics-gathering server.</li>
<li><code>WARNING</code>:
Use when something serious and unexpected happened, i.e. something that will
have user-visible consequences but is likely to be recoverable without data loss
by performing some explicit action, ranging from waiting or restarting an app
all the way to re-downloading a new version of an application or rebooting the
device. This level is always logged. Issues that justify some logging at the
WARNING level might also be considered for reporting to a statistics-gathering
server.</li>
<li><code>INFORMATIVE:</code>
Use to note that something interesting to most people happened, i.e. when a
situation is detected that is likely to have widespread impact, though isn't
necessarily an error. Such a condition should only be logged by a module that
reasonably believes that it is the most authoritative in that domain (to avoid
duplicate logging by non-authoritative components). This level is always logged.
</li>
<li><code>DEBUG</code>:
Use to further note what is happening on the device that could be relevant to
investigate and debug unexpected behaviors. You should log only what is needed
to gather enough information about what is going on about your component. If
your debug logs are dominating the log then you probably should be using verbose
logging.
<p>This level will be logged, even on release builds, and is required to be
surrounded by an <code>if (LOCAL_LOG)</code> or <code>if (LOCAL_LOGD)</code>
block, where <code>LOCAL_LOG[D]</code> is defined in your class or subcomponent,
so that there can exist a possibility to disable all such logging. There must
therefore be no active logic in an <code>if (LOCAL_LOG)</code> block. All the
string building for the log also needs to be placed inside the <code>if
(LOCAL_LOG)</code> block. The logging call should not be re-factored out into a
method call if it is going to cause the string building to take place outside
of the <code>if (LOCAL_LOG)</code> block.</p>
<p>There is some code that still says <code>if (localLOGV)</code>. This is
considered acceptable as well, although the name is nonstandard.</p>
</li>
<li><code>VERBOSE</code>:
Use for everything else. This level will only be logged on debug builds and
should be surrounded by an <code>if (LOCAL_LOGV)</code> block (or equivalent) so
it can be compiled out by default. Any string building will be stripped out of
release builds and needs to appear inside the <code>if (LOCAL_LOGV)</code> block.
</li>
</ul>
<p><em>Notes:</em> </p>
<ul>
<li>Within a given module, other than at the VERBOSE level, an
error should only be reported once if possible. Within a single chain of
function calls within a module, only the innermost function should return the
error, and callers in the same module should only add some logging if that
significantly helps to isolate the issue.</li>
<li>In a chain of modules, other than at the VERBOSE level, when a
lower-level module detects invalid data coming from a higher-level module, the
lower-level module should only log this situation to the DEBUG log, and only
if logging provides information that is not otherwise available to the caller.
Specifically, there is no need to log situations where an exception is thrown
(the exception should contain all the relevant information), or where the only
information being logged is contained in an error code. This is especially
important in the interaction between the framework and applications, and
conditions caused by third-party applications that are properly handled by the
framework should not trigger logging higher than the DEBUG level. The only
situations that should trigger logging at the INFORMATIVE level or higher is
when a module or application detects an error at its own level or coming from
a lower level.</li>
<li>When a condition that would normally justify some logging is
likely to occur many times, it can be a good idea to implement some
rate-limiting mechanism to prevent overflowing the logs with many duplicate
copies of the same (or very similar) information.</li>
<li>Losses of network connectivity are considered common, fully expected, and
should not be logged gratuitously. A loss of network connectivity
that has consequences within an app should be logged at the DEBUG or VERBOSE
level (depending on whether the consequences are serious enough and unexpected
enough to be logged in a release build).</li>
<li>Having a full filesystem on a filesystem that is accessible to or on
behalf of third-party applications should not be logged at a level higher than
INFORMATIVE.</li>
<li>Invalid data coming from any untrusted source (including any
file on shared storage, or data coming through just about any network
connection) is considered expected and should not trigger any logging at a
level higher than DEBUG when it's detected to be invalid (and even then
logging should be as limited as possible).</li>
<li>Keep in mind that the <code>+</code> operator, when used on Strings,
implicitly creates a <code>StringBuilder</code> with the default buffer size (16
characters) and potentially other temporary String objects, i.e.
that explicitly creating StringBuilders isn't more expensive than relying on
the default '+' operator (and can be a lot more efficient in fact). Keep
in mind that code that calls <code>Log.v()</code> is compiled and executed on
release builds, including building the strings, even if the logs aren't being
read.</li>
<li>Any logging that is meant to be read by other people and to be
available in release builds should be terse without being cryptic, and should
be reasonably understandable. This includes all logging up to the DEBUG
level.</li>
<li>When possible, logging should be kept on a single line if it
makes sense. Line lengths up to 80 or 100 characters are perfectly acceptable,
while lengths longer than about 130 or 160 characters (including the length of
the tag) should be avoided if possible.</li>
<li>Logging that reports successes should never be used at levels
higher than VERBOSE.</li>
<li>Temporary logging used to diagnose an issue that is hard to reproduce should
be kept at the DEBUG or VERBOSE level and should be enclosed by if blocks that
allow for disabling it entirely at compile time.</li>
<li>Be careful about security leaks through the log. Private
information should be avoided. Information about protected content must
definitely be avoided. This is especially important when writing framework
code as it's not easy to know in advance what will and will not be private
information or protected content.</li>
<li><code>System.out.println()</code> (or <code>printf()</code> for native code)
should never be used. System.out and System.err get redirected to /dev/null, so
your print statements will have no visible effects. However, all the string
building that happens for these calls still gets executed.</li>
<li><em>The golden rule of logging is that your logs may not
unnecessarily push other logs out of the buffer, just as others may not push
out yours.</em></li>
</ul>

<h3 id="be-consistent">Be Consistent</h3>
<p>Our parting thought: BE CONSISTENT. If you're editing code, take a few
minutes to look at the surrounding code and determine its style. If that code
uses spaces around the if clauses, you should too. If the code comments have
little boxes of stars around them, make your comments have little boxes of stars
around them too.</p>
<p>The point of having style guidelines is to have a common vocabulary of
coding, so people can concentrate on what you're saying, rather than on how
you're saying it. We present global style rules here so people know the
vocabulary, but local style is also important. If the code you add to a file
looks drastically different from the existing code around it, it throws
readers out of their rhythm when they go to read it. Try to avoid this.</p>

<h2 id="javatests-style-rules">Javatests Style Rules</h2>
<p>Follow test method naming conventions and use an underscore to separate what
is being tested from the specific case being tested. This style makes it easier
to see exactly what cases are being tested. For example:</p>
<pre><code>testMethod_specificCase1 testMethod_specificCase2

void testIsDistinguishable_protanopia() {
    ColorMatcher colorMatcher = new ColorMatcher(PROTANOPIA)
    assertFalse(colorMatcher.isDistinguishable(Color.RED, Color.BLACK))
    assertTrue(colorMatcher.isDistinguishable(Color.X, Color.Y))
}
</code></pre>
