TOP設計・移行・活用> Class名を利用した比較はおこなわない(C_IST002)
Javaコーディング規約
Javaコーディング規約

第9回:継承とインスタンスに関わるコーディング規約
著者: 電通国際情報サービス
高安 厚思、東田 健宏、岡 薫   2005/12/2
前のページ  1  2  3  4
Class名を利用した比較はおこなわない(C_IST002)

   この規約は、ClassクラスのgetName()メソッドによる比較は実施すべきではないという規約です。本規約で説明している問題点はClassクラス(注5)のgetName()メソッドは、nativeメソッドであり、Java VMの実装により下記の差異が発生する危険性があることです。
※注5: Classクラスは実行中のクラスおよびインターフェースを表現し、これらのメタ情報(フィールドやメソッドなど)を取得することができます。

  1. JDK 1.4以上のバージョンのgetName()メソッド実装では、常に当該クラスの完全指定名称が取得される
  2. JDK 1.4未満のバージョンのgetName()メソッド実装では、当該クラスの完全指定名称を返す実装およびパッケージ名を除いたクラス名称のみを返す実装が存在する。後者のクラス名称のみを返す実装では、パッケージ名称が異なり同一名称である別クラスを等しいと判断してしまう危険性がある

表3:Java VMのバージョンの違い

   しかしながら、この規約は間違いを含んでいました。本規約はJavaコーディング規約の次期バージョンにて適切に修正または削除される予定です。

   JDK 1.4未満(JDK 1.1/JDK 1.2/JDK 1.3)のJava APIドキュメントにおいて、「Class#getClass()は、当該クラスの完全指定名称を返す」ことが明示されています。

   Windows環境において、JDK 1.4未満にてこのメソッドの動作を検証したところ、これらすべてのバージョンでドキュメントの記述通り、完全指定名称が取得されることを確認しています。


まとめ

   今回はコーディング規約の継承・インスタンスを説明してきました。ここで紹介した規約は「規約を守れば可読性や保守性が高まる」ものでなく、冒頭で説明した通り、「規約を守らないとバグの可能性がある」規約であることが理解できたと思います。

   これらの規約を理解するのに必要とする知識は、Java言語を利用する上で基本中の基本となる「継承」や「インスタンス」に関するものですが、非常に奥が深い分野です。本記事は、これらの知識を習得するには十分なものではありません。参考書籍などを通じて、更なる知識の拡大と定着を目指してください。

   正確にこれらの知識を習得するには、多くの時間と労力を費やす必要がありますが、品質のよいプログラミングを実現するためには、最低限知っていて欲しい知識といえます。

前のページ  1  2  3  4


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


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


株式会社電通国際情報サービス 岡 薫
著者プロフィール
株式会社電通国際情報サービス  岡 薫
株式会社電通国際情報サービス アウトソーシング事業部所属
Java(J2EE)によるフレームワーク開発やWebのセキュリティ研究開発の経験を経て、現在は、大手企業の管理会計システムの開発プロジェクトに従事。多次元データベースの検索パフォーマンスを向上することに日々頭を悩ませている。


INDEX
第9回:継承とインスタンスに関わるコーディング規約
  はじめに
  abstractメソッドを利用する(C_IHT002)
  可能な限りtoString()メソッドを実装する(C_IHT005)
Class名を利用した比較はおこなわない(C_IST002)