blob: d5d16e1d19bf080c7d5242cdcfa07058f06eb1be [file] [log] [blame]
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<META NAME="description" CONTENT="Some coding conventions for developers working on NetBeans sources">
<title>NetBeans Code Conventions</title>
<link rel="stylesheet" type="text/css" href="../../netbeans.css">
<META NAME="NAV_LINK" content="Code Conventions">
<META NAME="NAV_PRIORITY" content="5">
<META NAME="AUDIENCE" CONTENT="NBDEVELOPER">
<META NAME="TYPE" CONTENT="ARTICLE">
<META NAME="TOPIC" CONTENT="NB_ORG">
</HEAD>
<body>
<h1>NetBeans Code Conventions</h1>
<BR>
<!--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-->
All NetBeans Java source code follows the &quot;Code Conventions for the Java
Programming Language&quot; as published by Sun. This document is available
online at
<blockquote>
<a href="http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html">
http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html</a>
</blockquote>
Here we list those rules from the <i>Code Conventions</i> which are most
important, plus some programming practices specific to NetBeans
<h2>Formatting</h2>
<ul>
<li>Files longer than 2000 lines are cumbersome and should be avoided.
<li>Each source file must include the license text in a comment at the very beginning.
(XML files may precede this by an XML declaration.)
<li>Avoid lines longer than 80 characters; long lines often force users to
scroll horizontally when they are concentrating on something else
(debugging, for example).
<li>Each top-level class should be kept in a separate file.
(It is fine to use nested classes, though generally discouraged when visible in an API.)
<li>When wrapping code lines, break after a comma or before an operator.
<li>Four spaces should be used as the unit of indentation. Tabs should be
avoided and if are used then must be set exactly every 8 spaces.
<li>An open brace <samp>{</samp> appears at the end of the same line that begins the
statement.
<li>A closing brace <samp>}</samp> starts a line by itself indented to match its
corresponding opening statement.
However null statements may be written as <samp>{}</samp> on one line.
<li>A blank space should appear after commas in argument lists.
<li>All binary
operators except <samp>.</samp> <i>(dot)</i> should be separated from their operands
by spaces. Blank spaces should never separate unary operators from their
operands.
</ul>
<h2>Programming Practices</h2>
<ul>
<li>Public classes and interfaces as well as public or protected methods and fields must
have documentation comments. See
<blockquote>
"How to Write Doc Comments for Javadoc"
<br><A HREF="http://java.sun.com/j2se/javadoc/writingdoccomments/index.html">http://java.sun.com/j2se/javadoc/writingdoccomments/index.html</A>
</blockquote>
for details on writing good doc comments.
<em>However</em> if a method simply overrides a superclass method, and does
not add any contractually significant behavior to it beyond what is obvious
from the class Javadoc, then the documentation comment should be omitted -
since JDK 1.3, the javadoc tool will automatically copy the documentation
from the superclass, which is more maintainable.
<li>All class and instance variables should be private except for constants
that are declared as <code>static final</code>.
<li>Throwing an unchecked exception without mentioning it in the Javadoc is
forbidden. <code>IllegalStateException</code> or JDK 1.4 assertions may be used when the
code is in an inconsistent state that it should be impossible to enter.
<li>If a method accepts <code>null</code> as an argument value, say so in the
method Javadocl otherwise callers must not pass <code>null</code> to method
calls.
<li>If a method returns <code>null</code>, document its meaning in the Javadoc;
otherwise it is safe for callers to assume the return value is
not <code>null</code>.
<li>Unless otherwise specified, all arrays passed into or out of
methods or constructors are assumed to be immutable, i.e. the contents
of the array must be fixed when it is constructed and never changed by
any party afterwards. Similarly, all collections (<code>List</code>,
etc.) are assumed to be immutable unless otherwise specified in the
Javadoc comments. To be sure, Javadoc ought to explicitly qualify
descriptions of array and collection parameters and return values as
"mutable" or "immutable". When they are mutable, some indication
should be given of who is permitted to mutate the array or collection
(e.g. creator of object only, receiver only, any party), and when
(e.g. required thread, lock, or mutex).
<li>All fields, parameters, and return values of collection types
(e.g. <code>Map</code> or <code>Enumeration</code>) must
specify what the intended element type is, as if generics were
in use. For code readability and ease of future transition to 1.5 source,
the source code should put generic markings in comments, for example:
<pre>
<span class="keyword">private</span> <span class="keyword">final</span> <span class="type">Map</span><span class="comment">/*&lt;String,List&lt;String&gt;&gt;*/</span> stuff = <span class="keyword">new</span> <span class="type">HashMap</span>();
</pre>
<li>If an exception is caught and ignored, there must be comments saying why;
if in doubt, notify with <code>ErrorManager</code> at <code>INFORMATIONAL</code>
level.
<li>Catch <code>Exception</code> only when a checked exception might be thrown;
if only unchecked exceptions are possible, catch
<code>RuntimeException</code>.
<li>If a <code>Throwable</code> is caught the handling code must
check whether it is an instance of <code>ThreadDeath</code> and in
this case rethrow it, unless it is expected that the thread might
be stopped (e.g. an executed subprocess). Generally catching
<code>Error</code> or <code>Throwable</code> should be
considered carefully, as conditions such as
<code>OutOfMemoryError</code> are not usually recoverable. Code
loading or deserializing <em>foreign</em> classes may catch
<code>LinkageError</code> in addition to <code>Exception</code>
to handle problematic code.
<li>Never throw a subclass of <code>Error</code> (unless rethrowing). In case
your method is called from an inappropriate place, or internal data structures
are in an inconsistent state and further processing would only compound the
problem, throw <code>IllegalStateException</code>; use <code>ErrorManager</code>
to annotate localized messages or other throwables as needed.
<li>String literals which are not intended to be localized should be marked
by putting a comment containing <samp>NOI18N</samp> in the same line. See <a
href="https://netbeans.org/download/dev/javadoc/org-openide-modules/org/openide/modules/doc-files/i18n-branding.html">Internationalization, Localization, and Branding of NetBeans</a>
for details.
<li>Careful with <code>string.toUpperCase()</code> and
<code>string.toLowerCase()</code>. In Turkish locale, <samp>I</samp>
and <samp>i</samp> are <em>not</em> case variants, they are
different letters. Unless you know
what you are doing, use <code>string.toUpperCase(Locale.US)</code> or
<code>string.toLowerCase(Locale.US)</code>.</li>
<li>Be friendly to the version control system: Do not reformat code without semantic/syntactic
changes, even in case existing code breaks formatting conventions.
<li>Prefer explicit imports to wildcards for clarity; if using NetBeans to edit code,
the <b>Fix Imports</b> command makes it easy to maintain them. Keep imports sorted.
</ul>
<h2>Code Example</h2>
<pre>
<span class="comment">/*
/* The contents of this file are subject to the terms of the Common
Development and Distribution License (the License). You may not use this
file except in compliance with the License. You can obtain a copy of the
License at https://netbeans.org/cddl.html
When distributing Covered Code, include this CDDL Header Notice in each
file and include the License. If applicable, add the following below the
CDDL Header, with the fields enclosed by brackets [] replaced by your own
identifying information:
"Portions Copyrighted [year] [name of copyright owner]"
Copyright 2005 Sun Microsystems Inc. All Rights Reserved
*/
</span>
<span class="keyword">package</span> <span class="constant">org</span>.<span class="constant">netbeans</span>.<span class="constant">modules</span>.<span class="constant">nosuchpackage</span>;
<span class="keyword">import</span> <span class="constant">java</span>.<span class="constant">util</span>.<span class="constant">ArrayList</span>;
<span class="keyword">import</span> <span class="constant">java</span>.<span class="constant">util</span>.<span class="constant">List</span>;
<span class="keyword">import</span> <span class="constant">org</span>.<span class="constant">openide</span>.<span class="constant">nodes</span>.<span class="constant">Node</span>;
<span class="comment">/**
* This is a totally useless class with a summary sentence ending with a period.
* Its only purpose is to demonstrate the NetBeans code conventions.
*/</span>
<span class="builtin">public</span> <span class="keyword">class</span> <span class="type">NoSuchClass</span> <span class="keyword">extends</span> <span class="type">SomeClass</span> {
<span class="comment">/** the default capacity */</span>
<span class="builtin">public</span> <span class="builtin">static</span> <span class="builtin">final</span> <span class="type">int</span> <span class="constant">DEFAULT_CAPACITY</span> = <span class="extra-java-font-lock-number">32</span>;
<span class="comment">/** the objects being stored, of type &lt;code&gt;NoSuchElement&lt;/code&gt; */</span>
<span class="builtin">private</span> <span class="builtin">final</span> <span class="type">List</span><span class="comment">/*&lt;NoSuchElement&gt;*/</span> <span class="variable-name">storage</span> = <span class="builtin">new</span> <span class="type">ArrayList</span>(50);
<span class="comment">/**
* Creates a new instance of &lt;code&gt;NoSuchClass&lt;/code&gt; with default capacity.
*/</span>
<span class="builtin">public</span> <span class="type">NoSuchClass</span>() {
<span class="keyword">this</span>(<span class="constant">DEFAULT_CAPACITY</span>);
}
<span class="comment">/**
* Creates a new instance of &lt;code&gt;NoSuchClass&lt;/code&gt; with a given capacity.
* @</span><span class="constant">param</span><span class="comment"> </span><span class="variable-name">capacity</span><span class="comment"> number of slots to be preallocated
*/</span>
<span class="builtin">public</span> <span class="type">NoSuchClass</span>(<span class="type">int</span> <span class="variable-name">capacity</span>) {
<span class="comment">// ... implementation goes here
</span> }
<span class="comment">/**
* Finds an entry with a given name.
* @</span><span class="constant">param</span><span class="comment"> </span><span class="variable-name">name</span><span class="comment"> name to look for
* @</span><span class="constant">return</span><span class="comment"> an entry with a specified name or &lt;code&gt;null&lt;/code&gt; if
* no such entry is found
*/</span>
<span class="builtin">public</span> <span class="type">Entry</span> <span class="function-name">findEntry</span>(<span class="type">String</span> <span class="variable-name">name</span>) {
<span class="comment">// ... boring code deleted ...
</span>
<span class="keyword">if</span> (<span class="string">&quot;nef&quot;</span>.equals(name)) { <span class="comment">// NOI18N, backdoor :-)
</span> <span class="comment">// ...
</span> } <span class="keyword">else</span> {
<span class="comment">// ...
}
<span class="comment">// ... boring code deleted ...
</span> }
}
</pre>
<!--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-->
<hr>
Edited by Trung Duc Tran &lt;<a href="mailto:trung.duc.tran@sun.com">trung.duc.tran@sun.com</a>&gt;
and Jesse Glick &lt;<a href="mailto:jglick@netbeans.org">jglick@netbeans.org</a>&gt;
<br><!-- hhmts start -->July 14, 2005<!-- hhmts end -->
<!--=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-->
</body>
</html>