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

<!--
    Copyright 2013 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 rules below are not guidelines or recommendations, but strict rules.
Contributions to Android generally <em>will not be accepted</em> if they do not
adhere to these rules.</p>

<p>Not all existing code follows these rules, but all new code is expected to.</p>

<h2 id="java-language-rules">Java Language Rules</h2>
<p>We follow standard Java coding conventions. We add a few rules:</p>
<h3 id="dont-ignore-exceptions">Don't Ignore Exceptions</h3>
<p>Sometimes it is tempting to write code that completely ignores an exception
like this:</p>
<pre><code>void setServerPort(String value) {
    try {
        serverPort = Integer.parseInt(value);
    } catch (NumberFormatException e) { }
}
</code></pre>
<p>You must never do this. While you may think that your code will never
encounter this error condition or that it is not important to handle it,
ignoring exceptions like above creates mines in your code for someone else to
trip over some day. You must handle every Exception in your code in some
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>
<p>Throw the exception up to the caller of your method.</p>
<pre><code>void setServerPort(String value) throws NumberFormatException {
    serverPort = Integer.parseInt(value);
}
</code></pre>
</li>
<li>
<p>Throw a new exception that's appropriate to your level of abstraction.</p>
<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>
<p>Handle the error gracefully and substitute an appropriate value in the
catch {} block.</p>
<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>
<p>Catch the Exception and throw a new <code>RuntimeException</code>. This is dangerous:
only do it if you are positive that if this error occurs, the appropriate
thing to do is crash.</p>
<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>Note that the original exception is passed to the constructor for
RuntimeException.  If your code must compile under Java 1.3, you will need to
omit the exception that is the cause.</p>
</li>
<li>
<p>Last resort: if you are confident that actually ignoring the exception is
appropriate then you may ignore it, but you must also comment why with a good
reason:</p>
<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>Sometimes it is 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>You should not do this. In almost all cases it is inappropriate to catch
generic Exception or Throwable, preferably not Throwable, because it includes
Error exceptions as well. It is very dangerous. It means that Exceptions you
never expected (including RuntimeExceptions like ClassCastException) end up
getting caught in application-level error handling. It obscures the failure
handling properties of your code. It means 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 that error differently. And in most cases you shouldn't be
handling different types of exception the same way, anyway.</p>
<p>There are rare exceptions to this rule: certain 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 that case you may catch
generic Exception (or Throwable) and handle the error appropriately. You
should 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.</p>
<p>Pros: can be handy for doing cleanup, particularly of external resources.</p>
<p>Cons: there are no guarantees as to when a finalizer will be called,
or even that it will be called at all.</p>
<p>Decision: we don'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>
<ol>
<li><code>import foo.*;</code></li>
</ol>
<p>Pros: Potentially reduces the number of import statements.</p>
<ol>
<li><code>import foo.Bar;</code></li>
</ol>
<p>Pros: Makes it obvious what classes are actually used. Makes
code more readable for maintainers. </p>
<p>Decision: Use the latter 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 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. Then a package
statement and import statements should follow, each block separated by a blank
line. And then there is the class or interface declaration. In the Javadoc
comments, describe what the class or interface does.</p>
<pre><code>/*
 * Copyright (C) 2013 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 3rd 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 having an important
side effect), then you must document it. And if it's not obvious what the
property "Foo" means, you should document it.</p>
<p>Every method you write, whether public or otherwise, would benefit from
Javadoc. Public methods are part of an API and therefore require Javadoc.</p>
<p>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>To the extent that it is feasible, methods should be kept small and
focused. It is, however, recognized 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>Fields should be defined 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>The scope of local variables should be kept 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, you should
postpone the declaration until you do.</p>
<p>One exception to this rule concerns 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>But 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>There should be 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. This meant that
the IDE's were either always changing the ordering, or IDE developers had to
disable the automatic import management features and maintain the imports by
hand. This was deemed bad. When java-style was asked, the preferred styles
were all over the map. It pretty much came down to our needing to "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, the
imports in all of the packages will end up matching this pattern without any
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 would prefer static imports to be interspersed with the
remaining imports, some would prefer them reside above or below all other
imports. Additionally, we have not yet come up with a way to make all IDEs use
the same ordering.</p>
<p>Since most people consider this a low priority issue, just use your
judgement and please be consistent.</p>
<h3 id="use-spaces-for-indentation">Use Spaces for Indentation</h3>
<p>We use 4 space indents for blocks. We never use tabs. When in doubt, be
consistent with code around you.</p>
<p>We use 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. So:</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. Except, 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. That is, this is legal:</p>
<pre><code>if (condition) {
    body(); 
}
</code></pre>
<p>and this is legal:</p>
<pre><code>if (condition) body();
</code></pre>
<p>but this is still illegal:</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.</p>
<p>There has been lots of discussion about this rule and the decision remains
that 100 characters is the maximum.</p>
<p>Exception: 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.</p>
<p>Exception: import lines can go over the limit because humans rarely see
them. This also simplifies tool writing.</p>
<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.&lt;</p>
<p>Android standard practices for the three predefined annotations in Java are:</p>
<ul>
<li>
<p><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></p>
<p>If you see old code that has a @deprecated Javadoc tag, please add the @Deprecated annotation.</p>
</li>
<li>
<p><code>@Override</code>: The @Override annotation must be used whenever a method overrides the
declaration or implementation from a super-class.</p>
<p>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.</p>
</li>
<li>
<p><code>@SuppressWarnings</code>: The @SuppressWarnings annotation should only be used 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>
<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. The names are much 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>Both the JDK and the Android code bases are very inconsistent with regards
to acronyms, therefore, it is virtually impossible to be consistent with the
code around you. Bite the bullet, and 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.</p>
<p>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 it's not kept reasonably
terse. The logging facilities provides five different levels of logging:</p>
<ul>
<li>
<p><code>ERROR</code>: 
This level of logging should be used when something fatal has happened,
i.e. something that 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 phone (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.</p>
</li>
<li>
<p><code>WARNING</code>: 
This level of logging should used 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.</p>
</li>
<li>
<p><code>INFORMATIVE:</code>
This level of logging should used be 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.</p>
</li>
<li>
<p><code>DEBUG</code>:
This level of logging should be used 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>
<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>
<p><code>VERBOSE</code>:
This level of logging should be used 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 that 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.</p>
</li>
</ul>
<p><em>Notes:</em> </p>
<ul>
<li>
<p>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.</p>
</li>
<li>
<p>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.</p>
</li>
<li>
<p>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.</p>
</li>
<li>
<p>Losses of network connectivity are considered common and 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).</p>
</li>
<li>
<p>A full filesystem on a filesystem that is acceessible to or on
behalf of third-party applications should not be logged at a level higher than
INFORMATIVE.</p>
</li>
<li>
<p>Invalid data coming from any untrusted source (including any
file on shared storage, or data coming through just about any network
connections) is considered expected and should not trigger any logging at a
level higher then DEBUG when it's detected to be invalid (and even then
logging should be as limited as possible).</p>
</li>
<li>
<p>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 quite a few 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). Also 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.</p>
</li>
<li>
<p>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.</p>
</li>
<li>
<p>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.</p>
</li>
<li>
<p>Logging that reports successes should never be used at levels
higher than VERBOSE.</p>
</li>
<li>
<p>Temporary logging that is used to diagnose an issue that's
hard to reproduce should be kept at the DEBUG or VERBOSE level, and should be
enclosed by if blocks that allow to disable it entirely at compile-time.</p>
</li>
<li>
<p>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.</p>
</li>
<li>
<p><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.</p>
</li>
<li>
<p><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></p>
</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 code around you and determine its style. If they use
spaces around their if clauses, you should too. If their 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 code you add to a 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></p>
<h2 id="javatests-style-rules">Javatests Style Rules</h2>
<h3 id="follow-test-method-naming-conventions">Follow Test Method Naming Conventions</h3>
<p>When naming test methods, you can use an underscore to seperate what is
being tested from the specific case being tested. This style makes it easier
to see exactly what cases are being tested.</p>
<p>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>
