torutkのブログ

ソフトウェア・エンジニアのブログ

Javaコーディング規約追補

最近GoogleJavaコーディング規約を公開したとニュースで知り、目を通してみたメモを書きます。
また、以前Javaのコーディング規約について調べたメモを次のURLに書きましたが、それ以降に公開されたJavaコーディング規約を探してみました。
http://www.alles.or.jp/~torutk/oojava/codingStandard/

Googleが策定・公開したJavaコーディング規約

先月、InfoQの日本語訳の記事で、Googleが最近Javaコーディング規約を公開したことを知りました。

さらっと目を通してみたメモを箇条書きで列挙します。

  • ファイルのエンコーディングUTF-8と決めている
  • 空白の文字を0x20に限定している
  • 1つのソースファイルには1つのトップレベルクラスだけ(複数書かない)
  • ワイルドカードimport文はstaticを含め書かない
  • import文は桁数限界を超えても行分割しない
  • import文の並び順について言及
  • クラスのメンバーの並び順は論理的な順序で
  • オーバーロードメソッドは続けて書く
  • 括弧は省略が許されている箇所も必ず書く(if, else, for, do, while)
  • K&Rスタイルの括弧(開き括弧前で改行しない、閉じ括弧の後で改行するのは文、メソッド、コンストラクタ、名前つきクラスが終了するとき)
  • ブロックのインデントは2空白文字で行う
  • 桁数は最大80文字または100文字、プロジェクト毎にどちらか選択可
  • 行の分割のルールについて言及
  • 行分割時の継続行のインデントは4空白
  • 垂直、水平方向の空白の入れ方について言及
  • enumクラス定義は条件付で1行にかいてもよい
  • switch文のラベルとブロックはそれぞれ2空白インデント
  • switch文でbreak, continue, return, throwを書かない場合はフォールスルーコメントを書く
  • switch文ではdefault必須
  • アノテーションの記述位置について言及
  • 修飾子の記述順序について言及
  • 命名規約について言及、ジェネリクス対応
    • 大文字の接頭辞語も先頭のみ大文字(例:HTTPは、Http)
  • @Overrideは必須
  • 例外を補足したら無視しない
  • staticフィールドの参照は変数名ではなくクラス名を使う
  • finalizeは使わない
  • Javadocコメントの書き方について言及
    • publicクラスとpublicまたはprotectedメンバーには最低Javadocを書く

Javaコーディング規約」(Acroquest)

https://www.acroquest.co.jp/webworkshop/javacordingrule/javacordingrule.html
社内で作成されてきたJavaコーディング規約を公開したもの(最近?)。

Eclipseを前提とした規約になっています(書式、ディレクトリ構成)。

さらっと目を通して気になるところを箇条書きで列挙します。

  • フィールドやメソッドの記述順番が可視性順になっている(論理的順序ではない)
    • 可視性の変更でメソッドを移動させるのはやだなぁ(バージョン管理で変更差分が見苦しくなるなど)
  • 内部クラス、無名内部クラスの使用を再利用性・可読性を損なうとの理由で原則禁止
    • GUIのイベントリスナー、コールバックは例外を設けている
    • staticなメンバクラスは言及ないみたい
  • パッケージ名でのアンダースコアの使用を可読性の観点で禁止
  • ループ変数に、i, j, kなど一文字変数を用いない
  • クラス、メソッドの最大ステップ数規定
  • メソッド内のブロックのネスとレベル最大数規定
  • ブロックの括弧がJavaの慣習と違って開き括弧の前で改行させる
  • コメントが必要な箇所として、if〜else文やswitch文なので、処理が複数に分かれる部分、for文やwhile文でループが終了する条件の部分、ほかが規定されている
  • パフォーマンスが特に重要となる複数要素の取得処理では配列を利用すること
    • パフォーマンスチューニングの原則(計測し改善)を謳ったほうがいいと思いますが・・・
  • ロギング処理についてはApache Commons LoggingやLog4jといった、ロギングライブラリを利用する・・・標準では、上記2つを組み合わせて利用することを標準とするが、
    • java標準ロギングは排除、ロギングは設計要素とおもってましたが。
  • Java SE 5.0の新機能について別章で言及

Java標準化規約」(富士通の総合システム開発体系SDAS)

http://jp.fujitsu.com/solutions/sdas/technology/develop-guide/2-regulation.html

いや、なんというか、うーん、パタッと閉じたくなる独特の雰囲気があります。

Javaセキュアコーディングスタンダード(CERT/Oracle版)

脆弱性を避けるコーディングについてなので、通常のコーディング規約とは少し観点が異なります。インターネットに接続されるシステムのソフトウェア開発ではしっかり押えておくコーディング作法と思います。

http://www.jpcert.or.jp/java-rules/
次は「並行処理編」
http://www.jpcert.or.jp/securecoding_materials.html