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

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

Comments

表 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 メソッドの効果的な使用法については、将来のヒントの中で説明することにします。


ダウンロード可能なリソース


関連トピック


コメント

コメントを登録するにはサインインあるいは登録してください。

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