適用範囲

  • プラットフォームを問わないJavaによる開発全て。

凡例

[2]:J2SE 1.2以降
[4]:J2SE 1.4以降
[5]:J2SE 5.0以降
[7]:Java SE 7以降
<例>:コードのサンプルを表す。
▲:半角スペースを強調する場合を表す。(※ブラウザ表示の便宜上、タブ文字も空白文字で表現する。)
<OK>:規約に準拠したコードの例。
<NG>:規約に違背したコードの例。

コーディングのガイドライン

ファイル

  • トップレベルのクラス又はインタフェース又は列挙型は1ファイルに1つとする。

使用できる文字

  • 文字コードはUTF-8とする。
  • \fや\b等の特殊文字を含めない。
  • Unicodeエスケープの使用は禁止する。
  • 識別子に使用出来る文字はA-Z,a-z,0-9,_のみとする。$の使用は禁止する。

  • 原則としてマルチステートメントは禁止する。for文の制御部のみ可とする。
<OK>
    int x;
    int y;
    int z;
    double value;
    for (int i = 0; i < 10; ++i) {
    }
<NG>
    int x, y, z; double value;
    for (int i = 0;
         i < 10;
         ++i) {
    }
  • 適切なインデントを行う。タブ幅は半角空白4文字分とし、タブ文字を使用する。
<OK>
    if (condition) {
        piyo();
    }
<NG>
    if (condition) {
piyo();
        }
  • 1行あたり80~100文字を目安とし、改行する場合は優先度の低い演算子の直前で行う。
  • コードを見易くする為に適宜空行を記述する。但し、3行以上の連続する空行は記述しない。
  • メソッド呼び出しで改行する場合は呼び出し行+1タブのインデントとし、開き括弧の位置では揃えない。
<OK>
    myMethod(param1, param2, param3
        , param4);
<NG>
    myMethod(param1, param2, param3,
             param4);
  • 変数名や代入演算子の位置を揃えない。
<OK>
    int▲alpha▲=▲0;
    double▲beta▲=▲0.0;
<NG>
    int    alpha = 0;
    double beta  = 0.0;
  • 到達しない文を記述しない。

パッケージ

package文

  • 原則として、プロジェクト毎に1つ以上のパッケージを作成する。(無名パッケージは使用しない。)命名規約も参照。

import文

  • 不要なimport文は記述しない。java.langのimport文は記述しない。
  • import文は原則としてパッケージ名の昇順に記述する。
  • 4つ以上の同一パッケージをimportする場合は「*」を使用しても良い。
  • [5]import static文は記述しない。

クラス

<例>
public▲final▲class▲Hoge▲extends▲HogeBase▲implements▲Piyo▲{
}
  • スーパークラス、実装インタフェースはこの順に記述する。
  • クラスの定義の最後にセミコロンを付けない。

継承

  • Objectを継承する場合はextends文を記述しない。
  • 継承を禁止するクラスはfinalクラスとして定義する。
  • Errorを継承しない。Throwableを直接継承しない。
  • [5]Enumを継承しない。

メンバ

  • クラスのメンバは内部クラス、フィールド、コンストラクタ、メソッドの順に記述する。
  • クラスメンバは「クラス名.メンバ名」で呼び出す。
  • インスタンスメンバは「インスタンス名.メンバ名」で呼び出す。自オブジェクトの場合は「this.メンバ名」で呼び出す。

内部クラス

  • 内部クラスの内部クラスは定義しない。

匿名クラス

  • 匿名クラスのメンバは最小限に留める。

インタフェース

<例>
public▲interface▲Piyo▲{
}

メンバ

  • インタフェースのメンバはフィールド、メソッドの順に記述する。
  • インタフェースのメンバはpublic修飾子を省略しない。
  • インタフェースのメソッドはabstruct修飾子を省略しない。

実装

  • シリアル化を絶対に行わない場合を除き、Serializableインタフェースを実装する。
  • シリアル化しないメンバはtransient修飾子を指定する。

列挙型

  • [5]列挙型にコンストラクタおよびメソッドを定義しても良い。
  • [5]列挙型のメンバは列挙値、コンストラクタ、メソッドの順に記述する。

フィールド

<例>
    public▲static▲final▲int▲MAX_COUNT▲=▲100;
    private▲int▲count▲=▲0;
  • フィールドは公開(public)、限定公開(protected)、パッケージ内公開(アクセス修飾子無し)、非公開(private)の順に記述する。
  • フィールドは定数、変数の順に記述する。
  • フィールドは機能のまとまりを考慮した順に記述する。(アルファベット順にしない。)
  • フィールド定数はクラスメンバ(static)とする。
  • フィールド変数は原則として公開(publicに)せず、外部からのアクセスは必要に応じて定義したアクセサメソッドを使用する。
  • フィールド変数を必要に応じて初期化しても良い。

コンストラクタ

  • デフォルトコンストラクタの処理が無い場合はこれを明示的に定義しない。

メソッド

  • 1メソッドは50~100step以下を目安、200stepを上限とし、それ以上となる場合は分割できないか積極的に検討する。
  • 呼出元に値を返す必要がある場合は原則として戻り値を使用する。(メソッドの成否を戻り値で、計算値を引数で返すスタイルを採用しない。)
  • [5]オーバーライドしたメソッドには@Overrideアノテーションを記述する。

定数

  • 定数はfinalを使用する。
  • 値を変更しない変数にはfinalを使用する。

リテラル

  • long型リテラルは値の後に大文字"L"を記述する。
  • float型リテラルは小数表現の値の後に大文字"F"を記述する。
  • double型リテラルは小数表現で記述する。
<OK>
    long l = 0L;
    float f = 0.0F;
    double d = 1.0;
<NG>
    long l = 0l;
    float f = 0.0f;
    double d = 1D;
  • [7]数値リテラルにアンダーバーを含める場合は下から4桁区切りの位置に記述する。
<OK>
    int i = 0x0123_4567;
<NG>
    int i = 0x0123456_7;

変数

スコープ

  • 変数のスコープは最小限に留める。変数宣言を関数の先頭に集めない。
  • 実質的にグローバルな変数は極力使用しない。

数値型

  • 整数は原則としてint型を使用する。
  • 小数は原則としてdouble型を使用する。
  • 値を表現するのが不可能または不適切な場合、計算量やメモリサイズを最適化する必要がある場合はその他の型を使用する。

論理型

<OK>
    boolean condition = true;
<NG>
    int flag = 0;   // 0: FALASE, 1:TRUE
  • 論理型変数はboolean型を使用する。

文字列型

  • 文字列型はStringクラスを使用する。
  • 文字列を頻繁に加工する場合はStringBuffer、StringBuilderクラスを使用する。

配列

  • 配列の宣言は「型名[]」とする。
<OK>
    int[] array = new int[10];
<NG>
    int array[] = new int[10];

コレクション

  • コレクションのサイズが予め明らかな場合は生成時に適切なサイズを指定する。
  • [2]コレクションはJava2以降のクラスを使用する。
<OK>
    ArrayList<Hoge> a;
    HashMap<Piyo> hm;
<NG>
    Vector v;
    Hashtable ht;

演算

  • 演算の順序が明確な場合でも()を用いて優先順位を明確にする。
<OK>
    int number = ((i * 3) + (j * 2));
<NG>
    int number = i * 3 + j * 2;

算術演算

  • インクリメント・デクリメントを除く算術演算子の前後には半角空白を1つだけ記述する。
<OK>
    i▲=▲j▲%▲2;     
<NG>
    i=j%2;
  • インクリメント・デクリメントが可能な場合は使用する。
<OK>
    --i;
<NG>
    i = i - 1;
  • インクリメント・デクリメントは式の意味が変化しない場合、前置で行う。

関係演算(比較)

  • 関係演算子の前後には半角空白を1つだけ記述する。
  • 数値の比較は原則として左辺が小さくなるよう記述する。
<OK>
    if (i < 10) {
<NG>
    if (10 > i) {
  • boolean型の変数とリテラルを比較しない。条件が偽となる場合は否定演算を使用する。
<OK>
    if (!condition) {
<NG>
    if (condition == false) {

型変換演算(キャスト)

  • キャスト演算子の前後には半角空白を記述しない。
  • 型変換を行う場合は明示的にキャスト演算子を記述する。
<例>
    int x = 5;
<OK>
    double number = (1.0 / (double)x);
<NG>
    double number = (1.0 / x);

条件演算

  • 条件演算子が使用できる場合は使用する。
<OK>
    return ((i < 10) ? x : y);

制御

反復

for文
<例>
for▲(int▲i▲=▲0;▲i▲<10;▲++i)▲{
}
  • 無限ループを記述する場合は「while (true)」を使用し、「for (;;)」は使用しない。
拡張for文
<例>
for▲(int▲i▲:▲array)▲{
}
  • 拡張for文が使用可能な場合は使用する。
while文
<例>
while▲(i▲<10)▲{
}
  • 無限ループの記述は最小限にとどめ、使用する場合は「while (true)」と記述する。
do-while文
  • 原則としてdo-while文の使用は避ける。

条件分岐

if文
<例>
if▲(i▲==▲0)▲{
    // 処理1
}▲else▲{
    // 処理2
}
  • 処理を行わないelse節は記述しない。else節で処理すべき内容が無いことを明示したい場合はコメントでその旨記述する。
switch文
<例>
switch▲(i)▲{
case▲HOGE:
case▲PIYO:
    // 処理1
    break;
default:
    // 処理2
    break;
}
  • フォールスルーは使用しない。但し、ラベルのみが連続する場合は除く。
  • 処理を行わないcase節、default節は記述しない。処理すべき内容が無いことを明示したい場合はコメントでその旨記述する。
  • caseラベル、defaultラベルはインデントせず行頭をswitchキーワードに揃える。
  • defaultラベルはswitch文の最後に記述する。

ジャンプ

break文
  • 入れ子になったループから抜ける為にラベル付きbreak文を使用しても良い。
continue文
  • 入れ子になったループから抜ける為にラベル付きcontinue文を使用しても良い。
return文
  • 1メソッドに複数のreturn文を記述しても良い。
  • return文に多項式を直接記述しても良い。

例外

try-catch-finally文
<例>
    try▲{
    }▲catch▲(final▲HogeException▲ex)▲{
    }▲finally▲{
    }
  • 0除算や配列境界オーバー等、予め防げる例外は発生させない。
  • 原則として繰り返し処理の中で例外処理を行わない。
<OK>
    try {
        for (int i = 0; i < 10; ++i) {
            // 処理
        }

    } catch (final HogeException ex) {
        // 例外処理
    }
<NG>
    for (int i = 0; i < 10; ++i) {
        try {
            // 処理
        } catch (final HogeException ex) {
            // 例外処理
        }
    }
  • finally句でreturn、throw、breakを記述しない。
リソース付きtry文
  • [7]AutoCloseインタフェースを実装したオブジェクトを使用する場合はリソース付きtry文を使用する。
<OK>
    try (InputStream inputStream = new FileInputStream(name1);
        OutputStream outputStream = new FileOutputStream(name2)) {
    }
<NG>
    InputStream inputStream = new FileInputStream(name1);
    try {
        OutputStream outputStream = new FileOutputStream(name2)) {
        try {
        } finally {
            outputStream.close();
        }

    } finally {
        inputStream.close;
    }
throw文
  • 例外オブジェクトを投げる場合は原則としてthrow文の行で生成(new)する。
<OK>
    throw new NullPointerException("nullです。");
<NG>
    Exception ex = new NullPointerException("nullです。");
    throw ex;

コメント

  • コメントを*その他記号で囲まない。
<NG>
// ****************************************
// * コメント                                   *
// ****************************************

行末コメント

<例>
    //▲コメント
  • コードを一時的にコメントアウトする場合は「//」を使用する。
  • コメントアウトしたコードを永続的に残さない。

ドキュメンテーションコメント

  • ドキュメンテーションコメントを記述する。
  • クラス、インタフェース、列挙型には必ず@version、@authorタグを記述する。
  • コンストラクタ、メソッドには必要に応じて@param、@return、@exceptionタグを記述する。
  • フィールドはドキュメンテーションコメント形式でコメントを記述する。

アサーション

  • [4]assertを使用しても良い。
<例>
    assert▲(condition)▲:▲"xが不正です。";

総称型

  • [7]ダイヤモンド演算子を使用して仮型引数を省略する。

アノテーション

スレッド

命名規約

全般

  • 原則として省略語は使用しない。
<OK>Instance
<NG>Inst
  • 冗長な単語は一般的な頭字語を使用する。
<OK>Html
<NG>HyperTextMarkupLanguage
  • ハンガリアン記法(システムハンガリアン)は採用しない。
<OK>int number;
<NG>int iNumber;
<OK>int count;
<NG>int mCount;

ファイル

  • クラスを定義するファイル名は「クラス名.java」とする。
<例>MainActivity.java

パッケージ

  • 小文字形式とし、役割を表す簡易な英単語又はその組み合わせとする。
<例>jp.gr.java_conf.electronautsstudio.(プロジェクト名).(機能名)

クラス

  • Pascal形式とし、役割を表す簡易な英単語又はその組み合わせとする。
<例>class MainActivity

インタフェース

  • Pascal形式とし、役割を表す簡易な英単語又はその組み合わせとする。
<例>interface Element

列挙型

  • 型名はクラス命名規約に準じる。
  • 列挙値はPascal形式とし、役割を表す簡易な英単語又はその組み合わせとする。

定数

  • 大文字形式とし、役割を表す簡易な英単語又はその組み合わせとする。
<例>final int MAX_COUNT = 10;

変数

  • スコープに関わらず、camel形式とし、役割を表す簡易な英単語又はその組み合わせとする。
<例>int number;

コンストラクタ

  • クラス名と同じ。

メソッド

  • スコープに関わらず、camel形式とし、役割を表す簡易な英単語又はその組み合わせとする。

引数

  • camel形式とし、役割を表す簡易な英単語又はその組み合わせとする。
<例>
void function(int parameter) {
}

仮型引数

  • [5]総称型の仮型引数は役割を表す簡易な英単語の頭文字を使用する。
<例>Key, Value ⇒ K, V

名前:
コメント:

Today: - Yesterday: - Total: -

最終更新:2012年01月27日 21:32