magazine.gif 実践Javaコーディング作法

はじめに
本書の構成と読み方

規約編
第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の静的解析とスタイルフォーマッター
  • コラム 市販の静的解析ツールによる規約遵守のチェック
  • コーディング規約適用観点一覧表

参考文献
索引