Javaプログラムにおける効果的なフィールドvisibility

フィールドの識別、インプリメント、およびアクセス

フィールド (属性またはメンバー属性とも言う) は、オブジェクトのデータ面を表します。フィールドの visibility は、Java オブジェクトからそのフィールドに対して行えるアクセスのレベルを定義します。今週の説明は、The Object Primer 2nd Edition の第 7 章と第 8 章を修正したものであり、フィールドの visibility のタイプ、フィールドのインプリメント法、およびフィールドへのアクセス法に焦点を当てています。

Scott W. Ambler, Practice Leader, Agile Development, Rational Methods Group, EMC

Scott W. Amblerは、オブジェクト指向ソフトウェア処理の指導、アーキテクチャー・モデリング、およびEnterprise JavaBeans (EJB) 開発を専門とするコンサルタント会社である、Ronin International の社長です。彼は、オブジェクト指向開発に関する本を執筆あるいは共同執筆しています。最近刊行されたものとしては、この記事で要約された主題を詳しく論じた The Object Primer 2nd Edition などがあります。彼の連絡先はwww.ambysoft.com にあるサイトです。



2000年 9月 28日

表 1 に、3 種類のフィールド visibility を示します。それぞれについて、Unified Modeling Language (UML) 記号、Java キーワード、visibility の意味の説明、およびその visibility の適切な使用法に関する提案を付しています。お気付きのとおり、フィールドの visibility の規則と表記は、前回説明した、メンバー関数の visibility の規則と表記と一貫性があります。

表 1: Java プログラムのフィールドの visibility
visibilityUML 記号Java キーワード説明用途 (案)
Public+publicpublic フィールドは、他のあらゆるオブジェクトまたはクラスに属する、他のあらゆるメソッドからアクセスできます。フィールドを public にしないでください。
Protected#protectedprotected フィールドは、そのフィールドが宣言されているクラスに属するあらゆるメソッド、あるいはそのクラスのサブクラスに属するあらゆる定義済みのメソッドからアクセスできます。 フィールドを protected にしないでください。
Private-privateprivate フィールドは、そのフィールドが宣言されているクラスに属するメソッドからしかアクセスできません。そのサブクラスに属するメソッドからアクセスすることはできません。すべてのフィールドを private とし、getter メソッドと setter メソッド (accessor) からアクセスされるようにしてください。

わたしの経験から言って、フィールドはすべて private として宣言すべきです。それは、情報の隠蔽とカプセル化を目的としてのことです。フィールドを protected として宣言すると、サブクラス内のメソッドがそれらのフィールドに直接にアクセスする可能性が生じ、事実上クラス階層内での結合が増加します。結合が増加すると、クラスの保守と拡張の困難が増します。よって、結合の増加を防がなければなりません。

さまざまな visibility を持つフィールドをインプリメントする方法を示すため、図 1 にAddress クラスのフィールド宣言を示します。ソース・コードの例から分かるとおり、public または protected のフィールドを宣言することは可能ですが、それが良い結果を生むことはまれです。

図 1: Address クラスのフィールド宣言
/**
* The city street of the address
*
* @example 1701 Enterprise Way
*/
private String street;

/**
* The name of the city
*
* @example Metropolis
*/
protected String city;

/**
* The state/province that the address is in
*/
public State state;

/**
* The ZIP code that the address is in
*
* @example 90210
*/
private String zipCode;

フィールドには、決して直接アクセスしてはなりません。代わりに accessor を使うべきです。accessor メソッドには 2 つのフレーバーがあります。setters とgetters です (それぞれmutators とaccessors と呼ばれることもあります)。setter がフィールドの値を変更するのに対し、getter はその値を取得します。わたしがこの規則に違反するとすれば、それは、accessor メソッドを使うとアプリケーションのパフォーマンスに著しい影響が及び、パフォーマンスを許容可能なレベルに改善する方法がほかにない場合だけです。その場合でさえ、直接にアクセスするフィールドの数を最低限に留めようとします。ついでながら、わたしは 1995 年の秋以来 Java テクノロジーを使用していますが、まだこの規則を破ったことはありません。それと同時に、これまでに会ったデベロッパーで、accessor メソッドのパフォーマンスについて不平を述べた人の数は数え切れません。

Java プログラマーが学ぶべき本質的な概念は、フィールドに直接働きかけることのできる accessor メソッドは、accessor そのものだけ であるということです。確かに、ある private フィールドに、そのフィールドが定義されているクラスのメソッドの中で直接にアクセスすることは可能ですが、そうしようと思ってはなりません。そうするなら、クラス内での結合が増加してしまうからです。実際、accessor の使用は、Enterprise JavaBeans (EJB) 2.0 環境では、すべての持続フィールドに対して用いられる方法となっています。accessor メソッドの効果的な使用法については、将来のヒントの中で説明することにします。

参考文献

フィールド visibility の詳細については、以下の資料を参照してください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=SOA and web services
ArticleID=244241
ArticleTitle=Javaプログラムにおける効果的なフィールドvisibility
publish-date=09282000