第6回:オブジェクト指向のためのコーディング規約 (2/4)

Javaコーディング規約
Javaコーディング規約

第6回:オブジェクト指向のためのコーディング規約
著者: 電通国際情報サービス  高安 厚思、東田 健宏
インクステクニカルサービス  島澤 甲   2005/10/18
前のページ  1  2   3  4  次のページ
クラス

   クラスを明確に書くことは可読性をあげるのみではありません。パフォーマンスにも左右し、再利用もしやすくなります。ここでは2つの規約をあげますので、参考にしてコードを作成してみてください。
継承させたくないクラスはfinal宣言する(C_CLS001)

   継承させたくないクラスを宣言する際には、次のようにfinal宣言をするといくつかのメリットがあります。

public final class Sample{
}
   まず、継承が行われないことが明確になるためコードの可読性の向上に繋がります。次に、クラスの継承およびメソッドのオーバーライドがないことがコンパイラに通知されるため、コードの最適化がより適切に行われます。そして、パスワード管理クラスなどのセキュリティに関わるクラスをfinalとすることで、予期しない継承によりセキュリティホールができる危険性を抑えることができます。

   逆に、利用してもメリットがほとんどないケースもあります。皆さんはJavaの文献や記事を読んでいて、「finalとすることでパフォーマンスの向上が見込める」という記述を目にしたことはないでしょうか。

   これはfinalを宣言することにより、コンパイラによるインライン化(注)が促進され、コードが最適化されてパフォーマンスが向上するという考えに基づくものなのですが、JVMが進化した現在ではパフォーマンス的なメリットはほとんどありません。

※注: インライン化とは最適化の一種で、メソッドの呼び出しをメソッド本体と置き換えてしまうことです。それによりメソッドの呼び出しにかかるオーバーヘッドをなくすことができます。

   finalは既存のコードの再利用性や拡張性を制限するので、パフォーマンスのためにfinalをいたるところで使うと、オブジェクト指向的な設計を妨害してしまい品質の低下をまねきます。よって、設計上制限をかける必要がある場合や設計がわかりやすくなる場合に使うべきです。


フィールドを宣言する順序はpublic(+)、protected(#)、デフォルト(~)、private(-) の順(C_CLS003)

   フィールド宣言の順番でpublicを一番上に持ってきているのは、コードを見る際にpublicフィールドに注目することが多いからという理由です。

   これは必ずしも守るべき規約ではなく、可読性の低下に繋がらないような書き方であれば特に問題はありません。意味合いでまとめる方法や型でまとめるといった方法も考えられます。ただし書き方を決定したらプロジェクト内で統一すべきです。不規則に混ぜて書くのは避けるようにしてください。

   なお、クラス変数については一番上に書くのが一般的です。


コンストラクタ

   コンストラクタを用いる場合には、あらかじめ権限や原則をしっかり決めておく必要があります。そうでないと、コンストラクタを用いても意味がなかったり、可読性を低下させたりすることになります。


public宣言していないクラスにはpublic権限のコンストラクタを作らない(C_CRT001)

   publicで宣言されていないクラスのコンストラクタにはどこからでもアクセスできるわけではないので、無意味な修飾子となってしまいます。コンストラクタのpublic修飾子を除去するか、クラスにpublic修飾子がつけられるよう設計を見直してください。


デフォルトコンストラクタは原則作成する(C_CRT002)

   まず、デフォルトコンストラクタとは引数のないコンストラクタのことで、具体的には次のようなものです。

public class Sample{
        public Sample(){ ← デフォルトコンストラクタ
        }
}
   この例ではデフォルトコンストラクタ中で初期化などを一切行っていませんので、一見意味のない実装に見えます。しかし引数のあるコンストラクタがあるときでもデフォルトコンストラクタを明確に実装することで次のことが可能になります。

  • Class.newInstance()を使用して、動的にインスタンスの生成を行う
  • インスタンス変数の初期値を決め、インスタンス生成時にその値で初期化を行う
   例外として、引数ありのコンストラクタでインスタンス生成を前提としている場合は、デフォルトコンストラクタを作成する必要はありません。

前のページ  1  2   3  4  次のページ


株式会社電通国際情報サービス 開発技術センター 高安 厚思
著者プロフィール
株式会社電通国際情報サービス  高安 厚思
株式会社電通国際情報サービス 開発技術センター
Java(J2EE)/オブジェクト指向の研究開発やプロジェクト支援、開発コンサルティングに従事。モデル、アーキテクチャ、プロセスが探求対象。今回は Javaコーディング規約2004の仕掛け人。


株式会社電通国際情報サービス 開発技術センター 東田 健宏
著者プロフィール
株式会社電通国際情報サービス  東田 健宏
株式会社電通国際情報サービス 開発技術センター
CTI、Webアプリの開発経験を経て、現在は主にプロジェクトマネジメント支援、プロセスエンジニアリング、ソフトウェア工学研究開発に従事。最近はコーチング、ファシリテーションといったヒューマン系スキルに興味を持ち日々修得に努めている。


インクステクニカルサービス株式会社 島澤 甲
著者プロフィール
インクステクニカルサービス株式会社  島澤 甲
インクステクニカルサービス株式会社 システム開発部所属
現在は主にJavaによるWebアプリの開発を担当している。Javaで初めてオブジェクト指向に触れ、オブジェクト指向による分かり易い設計とは何か日々模索している。


INDEX
第6回:オブジェクト指向のためのコーディング規約
  はじめに
クラス
  メソッド
  クラスメソッド
Javaコーディング規約
第1回 良いコードとは、心得5ヶ条
第2回 コーディングレベルを上げるためには?
第3回 ネーミング規約(前編)
第4回 ネーミング規約(後編)
第5回 フォーマットに関するコーディング規約
第6回 オブジェクト指向のためのコーディング規約
第7回 変数に関するコーディング規約
第8回 文字操作・数値・日付に関するコーディング規約
第9回 継承とインスタンスに関わるコーディング規約
第10回 制御構造に関する規約
第11回 コレクション・ストリーム・例外に関するコーディング規約
第12回 スレッド・ガベージコレクションに関するコーディング規約

人気記事トップ10

人気記事ランキングをもっと見る