TOP設計・移行・活用> 可能な限りtoString()メソッドを実装する(C_IHT005)
Javaコーディング規約
Javaコーディング規約

第9回:継承とインスタンスに関わるコーディング規約
著者: 電通国際情報サービス
高安 厚思、東田 健宏、岡 薫   2005/12/2
前のページ  1  2  3   4  次のページ
可能な限りtoString()メソッドを実装する(C_IHT005)

   toString()メソッドは、オブジェクトの文字列表現を返します。このメソッドは、デバッグ作業を行う上で有用な情報を提供します。

   迅速なデバッグを実現するために、クラスを作成する際には可能な限りtoString()メソッドを定義するべきです。toString()メソッドでは、オブジェクトの状態を適切なレベルで文字列として表現する必要があります。

   toString()メソッドを定義しない場合、ObjectクラスのtoString()メソッドが継承されます。このメソッドは対象オブジェクトの"完全限定名@ハッシュコード値の16進数表現"を返します。多くの場合、この戻り値ではデバッグするのに十分な情報とはいえません。

   また各クラスで定義すべきtoString()メソッドは、出力すべきフィールド名が変わるだけで、大部分のコードは重複します。フィールドの変更があった場合はtoString()メソッドも修正する必要があり、変更に手間がかかります。

   そのためtoString()メソッドの作成には工夫の余地があります。例えば「Commonclipseプラグイン」の利用によるtoString()メソッドの自動生成(注3)や、リフレクション機能を利用し、オブジェクトのすべてのフィールドを出力するユーティリティメソッドを作成する(注4)ことなどが考えられます。

※注3: 開発環境としてEclipseを利用しているならば、Commonclipseプラグインの利用をお勧めします。このプラグインにより、下記のObjectクラスのメソッドを自動で再定義してくれます。
toString()、hashCode()、equals(Object)、compareTo(Object)
※注4: リフレクションによるtoString()メソッドの実装方法は、下記の書籍で詳述されています。
「Java魂 -プログラミングを極める巧みの技」

   このような工夫によって、toString()メソッドの作成の省力化がはかれるとともに、コピー&ペーストによる問題を解決することができます。


インスタンス

   インスタンス同士を比較する方法は様々ありますが、各々の状況によって使うべきメソッドがあります。インスタンス同士の比較する際の状況、メソッドの意味を理解して使い分けてください。


オブジェクトどうしはequals()メソッドで比較する(C_IST001)

   「オブジェクトの内容が等しい」ことを判定するには、equals()メソッドを利用します。"=="による比較は、「オブジェクト参照が同一のオブジェクトかどうか」を判定します。双方の違いを理解して状況に応じて使い分ける必要があります。この理解が不十分であることからバグの原因となる場合があります。

   Stringクラスを利用したサンプルプログラムをみます。

Stringの比較
String a = new String("hoge");
String b = new String("hoge");
System.out.println(a == b); // 1. "false"が表示される。
System.out.println(a.equals(b));     // 2. "true"が表示される。
   1、2はそれぞれ次の比較を意味しています。

1. "=="演算子により、参照先オブジェクトの一致を比較している
変数a、変数bが参照しているStringオブジェクトはメモリ上、別々オブジェクトであるため比較結果は"false"となる。
2. Stringクラスのequals()メソッドにより、Stringオブジェクトの内容比較をしている
Stringのequals()メソッドは、「引数がnullでなく引数のオブジェクトと同じ文字シーケンスをあらわすStringオブジェクトである場合にtrueを返す」ため、"true"となる。

表2:比較の方法

   オブジェクトの比較を行う際には、1、2どちらの比較が適切かを考慮すべきです。また2を利用する場合、当該クラスのequals()メソッドは「オブジェクトが等しいという条件」を理解した上で利用すべきです。

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


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


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


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


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