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 | ★★★★★ | その他総括 |