Javaコーディング規約¶
規約条目ランク¶
| No. | 项目 | 
|---|---|
| ★★★★★ | ほぼ無条件に適用する | 
| ★★★★ | 特に理由がない限り、適用する | 
| ★★★ | プロジェクトの方針に左右されるが、大体のケースで適用する | 
| ★★ | 適用しなくても全体には影響しない | 
| ★ | このようなやり方もあるという紹介 | 
コーディングの心得5ヵ条¶
- 見やすさを重視せよ
 - ネーミングはわかりやすく
 - サンプルを鵜呑みにしない
 - おなじコードを2度書かない
 - 役割は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 | ★★★★★ | その他総括 |