Javaコーディング規約

規約条目ランク

No. 项目
★★★★★ ほぼ無条件に適用する
★★★★ 特に理由がない限り、適用する
★★★ プロジェクトの方針に左右されるが、大体のケースで適用する
★★ 適用しなくても全体には影響しない
このようなやり方もあるという紹介

コーディングの心得5ヵ条

  1. 見やすさを重視せよ
  2. ネーミングはわかりやすく
  3. サンプルを鵜呑みにしない
  4. おなじコードを2度書かない
  5. 役割は1つに

コンテンツ

1.ネーミングルール

1.1 全般

No. 重要度 条目
1.1.1 ★★★ 英語を使う
1.1.2 ★★★★★ 大文字/小文字の違いで名前を区別しない

1.2 パッケージ

No. 重要度 条目
1.2.1 ★★★★ パッケージ名は全て小文字で統一する
1.2.2 ★★★ パッケージ名には意味のある名前をつける
1.2.3 ★★★★ パッケージ名は省略しない
1.2.4 ★★★★ サブパッケージ名の重複はしてもよい
1.2.5 ★★★ パッケージの詳細はpackage-info.javaに記載する

1.3 クラス・インタフェース

No. 重要度 条目
1.3.1 ★★★ クラス名は役割を表す名前にする
1.3.2 ★★★★★ クラス名は単語の先頭を大文字にする
1.3.3 ★★★★ 例外クラス名には末尾に「Exception」をつける
1.3.4 ★★★★ インターフェイス名と実装クラス名の対応関係を明確にする
1.3.5 ★★★★ 抽象クラス名と実装クラス名の対応関係を明確にする (抽象クラスは**Abstract**Xxxxx/**Base**Xxxxx/**CasioBase**Xxxxx)
1.3.6 ★★ 能力付加型のインタフェース名は末尾に「able」を付ける

1.4 テストクラス

No. 重要度 条目
1.4.1 ★★★★ 単体テストを作成する場合にはJUnitなどのテストフレームワークを使う
1.4.2 ★★★★ テストクラス名は「テスト対象クラス名+Test」にする すべてのテスト:「AllTest?」 パッケージテスト:「パッケージ名+Test」

1.5 メソッド

No. 重要度 条目
1.5.1 ★★★★★ メソッド名は動詞で始まる適切な名前をつける
1.5.2 ★★★★ メソッド名は区切りのみ大文字にする
1.5.3 ★★★★ オブジェクトを生成するメソッド名は「create+オブジェクト名」にする<ファクトリメソッド>
1.5.4 ★★★★ 変換メソッド名は「to+変換先オブジェクト名」または「convert+変換先オブジェクト名」にする
1.5.5 ★★★★ booleanの戻り値を返すメソッド名はtrue/falseの状態がわかるようにする
**is + 形容詞:**isEmpty() / isAsleep()
**can + 動詞:**canGet() / canSpeakMultiLanguages()
**has + 過去分詞:**hasChanged() / hasExpired()
**三単元動詞[+名詞]:**contains() / containsKey()
1.5.6 ★★★★ 英単語の対義語を意識する:(send / receive)
(start / stop)
(register / unregister)
(put / get)
(set / get)
(クラスメンバーのアクセスメソッドの名前、ほかの場合、安易に使わなくてください)

1.6 引数

No. 重要度 条目
1.6.1 ★★★★ コンストラクタおよびメソッドのパラメータ名にはわかりやすい名前をつける

1.7 変数全般

No. 重要度 条目
1.7.1 ★★★★ 定数「static final」やenum定数は不変にし、すべて大文字で、区切りは「_」にする
1.7.2 ★★★★ 変数名は役割を反映させる(変数名は区切りのみ大文字にする)

1.8 ローカル変数

No. 重要度 条目
1.8.1 スコープが狭い変数名は、省略した名前でもよい
1.8.2 ★★★★ for文のループカウンタは、ネストごとに「i」「j」「k」...を使う

1.9 リソースファイル ★MobileOfficeシステム追加

No. 重要度 条目
1.9.1 ★★★★★ 画像ファイル

2.プログラミングルール/基礎編

2.1 全般

No. 重要度 条目
2.1.1 ★★★ オブジェクトの参照にはインタフェースを利用する
2.1.2 ★★★★★ 推奨されないAPIを使用しない
2.1.3 ★★★★ 使われないコードは書かない
2.1.4 ★★★★★ 適切なアクセス修飾子を使って宣言する
2.1.5 ★★ finalを適切に利用する (継承されないクラス/オーバーライドされないメソッド/値の変わらない変数)
2.1.6 ★★★★★ プリミティブ型と参照型の違いを意識する(定義編)
2.1.7 ★★★★★ プリミティブ型と参照型の違いを意識する(引数編)

2.2 メトリクス

No. 重要度 条目
2.2.1 ★★ 1メソッドの行数は約20行以下にする(多くとも50行)
2.2.2 ★★ 1クラスの行数は約600行以下にする(多くとも1000行)
2.2.3 ★★ 1クラス内のpublicメソッド数は20個以下にする
2.2.4 ★★ 1パッケージ内のクラス数は20個以下にする(多くとも30個)
2.2.5 ★★★ 相互参照を極力避ける

2.3 フォーマット

No. 重要度 条目
2.3.1 ★★★★ コードフォーマットは定義ファイルを作成し、IDEでフォーマットする
2.3.2 ★★ return文ではカッコを使わない
2.3.3 ★★★ 条件分岐では、「!」を使わない
2.3.4 ★★★ 不等号の向きは左向き(<、<=)にする
2.3.5 ★★★ 条件文で続けてメソッド呼び出しせずに一時変数に代入する
2.3.6 ★★★★ アクセスメソッド(get/setメソッド)はIDEで自動生成する

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

No. 重要度 条目
2.4.1 ★★★ ドキュメンテーションコメント(javadoc)には、少なくともauthor,param,return,throwsを記述する
2.4.2 ★★★★ ドキュメンテーションコメント(javadoc)は必要なものだけを簡潔に

2.5 パッケージ

No. 重要度 条目
2.5.1 ★★★★ java.langパッケージはインポートしない
2.5.2 ★★★★ import文にアスタリスクを使用しない
2.5.3 ★★★★ import文IDEで管理する

2.6 クラス

No. 重要度 条目
2.6.1 ★★★★★ 継承させたくないクラスはfinal宣言する
2.6.2 ★★★ フィールドは public、protected、デフォルト、privateの順に宣言する

2.7 コンストラクタ

No. 重要度 条目
2.7.1 ★★★★★ public宣言していないクラスにはpublic権限のコンストラクタを作らない
2.7.2 ★★★★★ コンストラクタはクラスの特性に応じて作成する

2.8 メソッド

No. 重要度 条目
2.8.1 ★★★★★ オーバーライドさせたくないメソッドにはfinalをつける
2.8.2 ★★★★ 戻り値が配列やCollectionの場合nullを返さない
2.8.3 ★★★★ publicメソッドはクラスの整合性を壊さないような設計にする
2.8.4 ★★★★ 一つのメソッドには一つの役割を担当させる
2.8.5 ★★★★ 引数の数が同じメソッドはオーバーロードしない
2.8.6 ★★★★★ オーバーロードしたメソッドには、@Overrideアノテーションを付与する
2.8.7 ★★★★ staticメソッドはクラス名を使って呼び出す

2.9 変数・配列

No. 重要度 条目
2.9.1 ★★★ 一度に複数の変数を宣言しない
2.9.2 ★★★★ リテラル値は直接使用せずにリテラル定数を定義する
2.9.3 ★★★★ 配列宣言は「型名[]」にする
2.9.4 ★★★ 出来るだけローカル変数を利用する
2.9.5 ★★★★★ 定数はstatic finalで宣言する
2.9.6 ★★★★ ローカル変数とインスタンス変数を使い分ける
2.9.7 ★★★ インスタンス変数はprivateもしくはprotectedにす
2.9.8 ★★★ public static final宣言した配列を利用しない
2.9.9 ★★★★ クラス変数にはクラス名を使って呼び出す
2.9.10 ★★★★ ローカル変数は利用する直前で宣言する
2.9.11 ★★★★★ ローカル変数・メソッド引数は安易に再利用しない

2.10 文字列操作

No. 重要度 条目
2.10.1 ★★★★★ 文字列リテラルはnewしない
2.10.2 ★★★★★ 文字列同士が同じ値かを比較するときは、equals()メソッドを利用する
2.10.3 ★★★★ 文字列の連結にはStringBuilderクラスを利用する
2.10.4 ★★★★★ 文字列リテラルと変数を比較するときは、文字列リテラルのequals()メソッドを利用する
2.10.5 ★★★★ プリミティブ型とStringの変換には、用意された変換用のメソッドを利用する
2.10.6 ★★★★ システム依存記号(\n、\rなど)は使用しない
1
2
3
    //2.10.5
    String s1 = String.valueOf(123);
    int int1 = Integer.parseInt("123");

2.11 数値

No. 重要度 条目
2.11.1 ★★★★★ 誤差なく計算したい時は、BigDecimalクラスを使う
2.11.2 ★★★★★ 数値の比較は精度に気をつける
2.11.3 ★★★★ 低精度なプリミティブ型へのキャストを避ける

2.12 日付

No. 重要度 条目
2.12.1 ★★ Date、Calendarの代わりにlongの利用を検討する

2.13 Java5以後に追加された機能

No. 重要度 条目
2.13.1 ★★★★ できるだけ拡張for文を使う
2.13.2 ★★★★ Collectionを積極的に使って配列を減らす
2.13.3 ★★★★ アノテーションでコードの状態をわかりやすくする
2.13.4 ★★ アノテーションの基本的な作り方を把握する
2.13.5 ★★★★ ListやMapにはジェネリクスを使う
2.13.6 ★★★★ オートボクシングは使用しないか、null変換を必ず行う
2.13.7 ★★ ジェネリクスを代入する場合は境界ワイルドカードを使う
2.13.8 ★★★ グループの固定値を表す場合はenumを使う
2.13.9 ★★★ 存在しない値についてEnum#valueOfを呼び出さない
2.13.10 ★★★ 可変長引数は極力使わない
2.13.11 ★★★★★ 非推奨のクラス・メソッド・フィールドには@Deprecatedをつけて代替手段を提示する
2.13.12 ★★★★★ 補助文字を使用する場合は、String#length()とString#charAt()を使わなくて{{div_start_tag(color_red)}}String.codePointCount()/String.codePointAt(){{div_end_tag}}を使う
2.13.13 ★★★★★ BigDecimalのフォーマットにはDecimalFormatかBigDecimal#toPlainStringを使う
2.13.14 ★★★★★ マルチスレッドプログラミングをする場合はJava5標準のExecutorフレームワークを利用する
2.13.15 ★★ 時間の単位変換にはTimeUnitを使う
2.13.16 ★★★ staticインポートは利用するかどうかを統一する

3.プログラミングルール/テクニック編

3.1 継承

No. 重要度 条目
3.1.1 ★★★ 継承の前に委譲を検討する
3.1.2 ★★★★ スーパークラスのメンバ変数と同じ変数名をサブクラスで宣言しない
3.1.3 ★★★★ equals()メソッドとhashCode()はIDEで自動生成する
3.1.4 ★★★ 可能な限りtoString()メソッドを実装する
3.1.5 ★★★★★ Cloneable#cloneを使わず、自前のコピーメソッドを利用する

3.2 インスタンス

No. 重要度 条目
3.2.1 ★★★★ オブジェクト同士の比較方法の違いを意識する
3.2.2 ★★★★★ Classオブジェクトを比較する場合、文字列で比較しない
3.2.3 ★★★★ キャスト処理はinstanceof演算子で囲む

3.3 制御構造

No. 重要度 条目
3.3.1 ★★★★ 制御文(if,else,while,for,do-while)の{}は省略しない
3.3.2 ★★★★ 空の{}ブロックを利用しない
3.3.3 ★★★ forとwhileの使い分けを意識する
3.3.4 ★★★ for文を利用した繰返し処理の中でループ変数の値を変更しない
3.3.5 ★★★★ for文のカウンタは0から始める
3.3.6 ★★★ breakやcontinueを不用意に使わない
3.3.7 ★★★★★ 単純な配列をコピーするときはclone()など既存のメソッドを利用する
3.3.8 ★★★ 繰返し処理中のオブジェクトの生成は最小限にする
3.3.9 ★★★ if文とelse文の繰り返しやswitch文の利用はなるべく避け、オブジェクト指向の手法を利用する
3.3.10 ★★★ 繰り返し処理の内部で、try/catchブロックを利用しない
3.3.11 ★★ if/whileの条件式で「=」は利用しない

3.4 コレクション

No. 重要度 条目
3.4.1 ★★★★ Java2以降のコレクションクラスを利用する

3.5 終了処理

No. 重要度 条目
3.5.1 ★★★★★ リソースを扱うAPIを利用するときは、finallyブロックで後処理をする

3.6 例外処理

No. 重要度 条目
3.6.1 ★★★ catch文で受け取った例外を処理しない場合は適切なエラー情報を付与する
3.6.2 ★★★★★ 例外を再スローするときは、元の例外をスローする例外に入れる
3.6.3 ★★★ Exceptionクラスのオブジェクトを生成してスローしない
3.6.4 ★★★★★ catchブロックでは必ず処理をする
3.6.5 ★★★★★ Error、Throwableクラスを継承しない
3.6.6 ★★★★★ finallyブロックで戻り値に影響がある記述はしない
3.6.7 ★★★★★ finallyから例外をthrowしない

3.7 マルチスレッド

No. 重要度 条目
3.7.1 ★★★★ RunnableまたはCallableインタフェースを実装する
3.7.2 ★★★★ 待機中のスレッドを再開するにはnotifyAll()メソッドを利用する
3.7.3 ★★★★ スレッドを切り替えたい場合はThreadクラスのyield()メソッドは利用しない
3.7.4 ★★★★★ synchronizedブロックから「synchronizedブロックのあるメソッドを呼び出さない
3.7.5 ★★★★★ wait()、notify()、notifyAll()メソッドは、synchronizedブロックの中で利用する
3.7.6 ★★★★★ wait()メソッドの後で前題条件を再確認する
3.7.7 ★★★★ 処理の待ち合わせにはポーリングループを利用せずにCountDownLatchなどの既存の仕組みを利用する
3.7.8 ★★★★ 同期化(synchronized)の適用は必要な部分だけにする
3.7.9 ★★★★ マルチスレッド環境下ではConcurrentHashMapやCopyOnWriteArrayListを使う

3.8 ガーベッジコレクション

No. 重要度 条目
3.8.1 ★★★★ finalize()をオーバーライドしない

3.9 その他

No. 重要度 条目
3.9.1 ★★★★ 匿名(とくめい)クラスにメソッド引数を渡す場合、finalを使用する
3.9.2 ★★★★ 複数の値を返すのに、配列やMapを使用しない

4.補足

4.1 ネーミング総括

No. 重要度 条目
4.1.1 ★★★★★ ネーミング総括

4.2 その他総括

No. 重要度 条目
4.2.1 ★★★★★ その他総括