実践Javaコーディング作法
日経BP社
著者:森崎雅稔
監修:渡辺純
はじめに
本書の構成と読み方
規約編
第1章 命名に関する規約
1.1 命名全般
規約1 名前には英単語を使用する
規約2 大文字と小文字で名前を区別しない
1.2 パッケージ
規約3 パッケージ名はすべて小文字にする
規約4 パッケージ名には省略語を使用しない
規約5 インポートは「*」で省略しない
1.3 クラス
規約6 クラス名は役割を表す名前にする
規約7 クラス名はPascal形式で記述する
規約8 クラス名はフルスペルで記述する
規約9 抽象クラス名の末尾に「Abstract」を付ける
規約10 インタフェース名はクラス名に準ずる
規約11 例外クラス名の末尾に「Exception」を付ける
規約12 テストクラス名の末尾に「Test」を付ける
1.4 メソッド
規約13 メソッド名は目的のわかる名前にする
規約14 メソッド名はCamel形式で記述する
規約15 メソッドの役割の対称性を意識する
規約16 ゲッターメソッド名は「get+属性名」とする
規約17 セッターメソッド名は「set+属性名」とする
規約18 booleanを返すメソッドはtrue/falseの識別がわかる名前にする
1.5 変数・定数
規約19 変数には意味のある名前を付ける
規約20 変数名はCamel形式で記述する
規約21 boolean型の変数はtrue/falseの識別がわかる名前にする
規約22 GUIコンポーネントの命名にはコンポーネントの型を付加する
規約23 引数名とフィールド名が同じになることを回避する
規約24 定数名は「_」で区切った大文字表記とする
第2章コーディングに関する規約
2.1 全般
規約25 1つのクラスは1つのソースファイルで定義する
規約26 推奨されないAPIを使用しない
規約27 使われないコードは書かない
規約28 クラスやメソッドのアクセス修飾子の宣言は適切な権限で行う
規約29 メソッド定義とメソッド定義の間に空行を入れる
規約30 プリミティブ型と参照型の違いを意識する
規約31 ラッパークラス型よりプリミティブ型を使う
2.2 スタイル
規約32 クラス定義の記述順序を守る
規約33 110桁を超える行は改行または文を分割する
規約34 行の途中での改行は、カンマの後、演算子の前、節(予約後)の前とする
規約35 クラスとメソッドの宣言行およびブロック開始行の末尾に「{」を記述する
規約36 「{」の後ろにステートメントを記述しない
規約37 インデントは半角の空白文字を使い4桁分とする
規約38 ブロックの開始行と終了行のインデントを揃える
規約39 ブロックの内部のインデントを揃える
規約40 無駄な空行は入れず意味のある切れ目で入れる
規約41 1行に2つ以上のステートメントを書かない
規約42 比較演算子は「<」か「<=」を使う
規約43 オートボクシングを使用しない
規約44 カンマ、セミコロン、コロンの後ろや演算子の前後に空白を入れる
2.3 クラス定義
規約45 継承させたくないクラスにはfinal宣言をする
規約46 クラスのtoStringメソッドを装備する
規約47 メソッドのないインタフェースを定義せず定数クラスを使う
規約48 定数クラスにはstaticイニシャライザを使う※JavaSE5以降
2.4 メソッド定義
規約49 メソッドの最大行数は150行とする
規約50 循環的複雑度の上限を19とする
規約51 オーバーライドさせたくないメソッドはfinal宣言をする
規約52 メソッドの引数の順序には根拠がある
規約53 配列やコレクションを返すメソッドではnullを返さない
規約54 引数の数は少なめにする
規約55 引数の正当性を検査する
規約56 クラスメソッドを実行するときはクラス名を使って呼び出す
2.5 変数・定数
規約57 定数はstatic finalを宣言する
規約58 リテラルは原則として使わず定数を使う
規約59 配列の宣言は型名に「[]」を付けて行う
規約60 配列は宣言時に大きさを明確にする
規約61 2次元以上の配列を宣言しない
規約62 配列のコピーにはarraycopyメソッドを使用する
規約63 インスタンス変数は必ず初期化する
規約64 インスタンス変数はprivateで宣言する
規約65 むやみにアクセッサ(セッター、ゲッタ)を定義しない
規約66 クラス変数にpublic static final宣言した配列を利用しない
規約67 クラス変数はクラス名を使ってアクセスする
規約68 ローカル変数名とフィールド名が同じになることを回避する
規約69 ローカル変数は安易に再利用しない
規約70 ローかす変数は使用する直前に初めて宣言と初期化を行う
2.6 文字列操作
規約71 更新される文字列にはStringBuilderを使用する
規約72 更新されない文字列にはStringを使用する
規約73 プリミティブ型とStringオブジェクトとの変換には変換メソッドを使用する
2.7 数値操作
規約74 誤差のない計算をするにはBigDecimalを使用する
規約75 数値の精度に気をつける
規約76 4桁以上の数値リテラルには3桁ごとにアンダースコアを挿入する※JavaSE7以降
規約77 低精度なプリミティブ型にキャストしない
2.8 継承
規約78 スーパークラスのインスタンス変数をサブクラスで重複して定義しない
規約79 スーパークラスのprivateメソッドと同名のメソッドをサブクラスで定義しない
規約80 equalsメソッドを実装した場合にはhashCodeメソッドも実装する
規約81 Cloneableインタフェースは明示的に実践する
2.9 インスタンス
規約82 オブジェクト同士はequalsメソッドで比較する
規約83 instanceofをキャストの可否判断に使う
2.10 制御構造
規約84 制御文の「{}」は省略しない
規約85 for文では3つのカウンタ条件を完備させる
規約86 for文とwhile文を正しく使い分ける
規約87 for文を利用した繰り返し処理の中でカウンタ変数の値を変更しない
規約88 配列やコレクションを処理するループに拡張for文を使う
コラム Java 8ではfor文が不要になる
規約89 繰り返し中のオブジェクトの生成は要否を考える
規約90 繰り返し処理のループの中にtry/catchブロックを記述しない
規約91 switch文ではcaseごとにbreakを書く
規約92 switch文ではdefaultを必ず書きbreakも書く
★規約93 switch文で文字列による分岐の際に文字列をnullチェックする※JavaSE7以降
2.11 コレクション
規約94 CollectionやMapにはジェネリクスを使う※JavaSE5以降
規約95 オブジェクトの集合の繰り返し処理にはStream APIを試用する※JavaSE8以降
2.12 ストリーム操作
規約96 AutoCloseableを実装していないストリームを扱うときにはfinallyブロックでクローズ処理をする
規約97 AutoCloseableを実装しているストリームを扱うときはリソース付きtry文を使用する※JavaSE7以降
規約98 ObjectOutputStreamではresetメソッドを使用する
規約99 ストリームの操作でバッファ入出力を使う
2.13 例外処理
規約100 catch文でキャッチする例外は詳細な例外クラスでキャッチする
規約101 Exceptionクラスのオブジェクトを生成してスローしない
規約102 finallyブロックには戻り値に影響がある記述をしない
規約103 catchブロックでは必ず処理をする
規約104 Error、Throwableクラスを継承しない
2.14 ガベージコレクション
規約105 finalizaはオーバーライドしない
規約106 アプリケーションからfinalizeを呼び出さない
第3章 コメント・アノテーションに関する規約
3.1 全般
規約107 コメントは説明したいコードの直前の行に記述する
規約108 コメントは必要なものだけを簡潔に書く
規約109 コメントアウトしたプログラムの断片を次工程まで放置しない
3.2 javadoc
規約110 Javadocの記述を揃える
3.3 アノテーション
規約111 オーバライドするメソッドにはOverrideアノテーションを使用する※Java SE5以降
規約112 関数型インタフェースの定義にはFunctionalInterfaceアノテーションを使用する※JavaSE8以降
解説編
第4章 規律のある実装と、開発マネージメントの心得
4.1 最初にすること
4.2 プログラミング中にすること
4.3 最後に
コラム Eclipseの静的解析とスタイルフォーマッター
コラム 市販の静的解析ツールによる規約遵守のチェック
コーディング規約適用観点一覧表
参考文献
索引