This is an extrapolation of the formatting instructions in GNU's standards documentation.
New Java code for GNU Crypto should be written in "GNU style", with slight modifications for Java. The usual rules for Java code are:
Put each class into its own file, and put that file in a sequence
of directories that match that class's package. So put a class
`foo.bar.Baz' into the file
`foo/bar/Baz.java'.
Package names should be lower case, and should be a single word or abbreviation.
The basic unit of indentation is two spaces. Only spaces should be used to indent, not tabs.
Import each class used and never write the package name before the class name, unless it is needed to avoid conflicts.
List your imports alphabetically, and split large lists by package. Don't use the wildcard syntax unless you need to import a large number of classes from one package.
Write variable and class names in mixed capitals, and capitalize the first letter if it is a class name. For example, a class name would look like ``ClassName'' and a variable ``variableName''.
Section your code into logical pieces, like "Constants and fields", "Constructors", "Class methods", and "Instance methods".
Delimit each section with a form feed and a comment like the following:
// Constants and fields. // -------------------------------------------------------------------------
Keep lines under 80 columns wide.
All top-level class and interface declarations should begin at column zero, and the opening brace should be on the next line, in column zero.
Method declarations and member class declarations should begin at the next level of indentation. That is, a method declaration for the top-level class would be indented two spaces, and that method's opening and closing braces are on their own lines indented two spaces.
List modifiers in this order: access modifier, static or abstract, final, synchronized, then anything else.
Put a space between a keyword or method name and the opening parentesis, but not if the method takes no arguments:
if (condition)
...
method (parameters);
method();
Indent the braces for control structures like this:
for (int i = 0; i < limit; i++)
{
statements;
}
Omit the braces for control structures if there is only a single statement in the body:
while (condition)
statement;
If a parameter list or list of conditionals will not fit on a single line, break the list and indent under the opening parenthesis:
method(parameterOne, parameterTwo + 42, (Cast) parameterThree,
parameterFour, parameterFive);
if (conditionOne < limitOne && conditionTwo != limitTwo
&& conditionThree)
If the opening parenthesis starts at column 40 or greater, however, break the line and indent two spaes.
If the ``throws'' clause of a method, if any, will not fit on
the same line as the method declaration, break the line before the
throws keyword and indent two spaces:
someLongMethodName(SomeClass someParameter, AnotherClass anotherParameter)
throws SomeException
{
}
If the list of exceptions will not fit on a single line, break the
line and indent past the throws:
someLongMethodName(SomeClass someParameter, AnotherClass anotherParameter)
throws SomeException, AnotherException, AThirdException,
AFourthException
{
}
Chain your exceptions! It greatly aids debugging if you can get a complete stack trace:
someExceptionMethod() throws SomeException
{
try
{
someOtherExceptionMethod();
}
catch (SomeOtherException soe)
{
SomeException se = new SomeExceptino (soe.getMessage());
se.initCause (soe);
throw se;
}
}
Method parameters that are not changed should be marked
final, as should any member fields in an immutable
class.
The following is a basic example of how to format your source code:
/* One line to describe the class.
Copyright (C) 2004 Free Software Foundation, Inc.
This file is part of GNU Crypto.
GNU Crypto is free software; you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2, or (at your option) any
later version.
GNU Crypto is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; see the file COPYING. If not, write to the
Free Software Foundation Inc.,
59 Temple Place - Suite 330,
Boston, MA 02111-1307
USA
Linking this library statically or dynamically with other modules is
making a combined work based on this library. Thus, the terms and
conditions of the GNU General Public License cover the whole
combination.
As a special exception, the copyright holders of this library give you
permission to link this library with independent modules to produce an
executable, regardless of the license terms of these independent
modules, and to copy and distribute the resulting executable under
terms of your choice, provided that you also meet, for each linked
independent module, the terms and conditions of the license of that
module. An independent module is a module which is not derived from
or based on this library. If you modify this library, you may extend
this exception to your version of the library, but you are not
obligated to do so. If you do not wish to do so, delete this
exception statement from your version. */
package ...;
import ...;
public class ClassName extends SuperClass implements Interface
{
// Constants and fields.
// -------------------------------------------------------------------------
public static final Object CONSTANT;
private final Object field;
^L// Constructors.
// -------------------------------------------------------------------------
public ClassName(final Object field)
{
this.field = field;
}
public ClassName()
{
this(CONSTANT);
}
^L// Class methods.
// -------------------------------------------------------------------------
public static Object classMethod() throws SomeException
{
...;
}
^L// Instance methods.
// -------------------------------------------------------------------------
public Object getField()
{
return field;
}
}
Return to GNU's home page.
Copyright 2004 Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA
Verbatim copying and distribution of this entire article is permitted in any medium, provided this notice is preserved.
Updated: $Date: 2004/04/24 20:42:06 $ $Author: rsdio $