本文へジャンプ

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


お客様が developerWorks に初めてサインインすると、プロフィールが作成されます。プロフィールで選択した情報は公開されますが、いつでもその情報を編集できます。お客様の姓名(非表示設定にしていない限り)とディスプレイ・ネームは、投稿するコンテンツと一緒に表示されます。

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

  • 閉じる [x]

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

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

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


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

  • 閉じる [x]

Java accessorのvisibility

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

概要: この記事ではaccessorメソッドのvisibilityに関する指針を示します。これは、The Object Primer 2nd Edition の第8章を変更したものです。

日付:  2000年 10月 19日
レベル:  初級 この記事の原文:  英語
アクティビティー: 1102 ビュー
お気軽にご意見・ご感想をお寄せください: 


私は、accessorを紹介した「accessorを使用するとJavaコードの堅牢性が高まります」の中で、accessor (フィールドの値を直接操作するメンバー関数) がコードに最小限のオーバーヘッドを与える可能性があることを述べました。しかし同時に、accessorは、クラスのインプリメンテーションの詳細を隠すのに役立ちますので、クラスおよびコンポーネントの堅牢性を高めます。accessorにはsetterとgetterの2つのフレーバーがあります。setterはフィールドの値を変更し、getterはフィールドの値を取得します。

あるメンバー関数のvisibilityを選択すると、Javaオブジェクトによるその関数へのアクセス・レベルが定義され、ユーザーのソフトウェア内の結合を減らすことが可能になります。accessorは単なるJavaメンバー関数であるため、accessorのvisibilityを慎重に選択することが大切です。"Java プログラムにおけるメンバー関数の visibility" の中で述べたように、Javaでは、public、protected、private、およびデフォルトの4つのレベルのvisibilityが使用できます。

  • public visibilityが指定されたメンバー関数は、他のどのオブジェクトまたはクラスの中の、どの任意のメンバー関数によっても呼び出すことができます。
  • protected visibilityが指定されたメンバー関数は、その関数を定義したクラス、またはそのクラスのどのサブクラスの中のどのメンバー関数によっても呼び出すことができます。
  • private visibilityが指定されたメンバー関数は、その関数を定義したクラスの中の他のメンバー関数によってのみ呼び出すことができ、サブクラス内のメンバー関数によって呼び出すことはできません。
  • デフォルト visibilityが指定されたメンバー関数は、実質的に、同じパッケージ内のすべての他のクラスにとってはpublicであり、パッケージの外部のクラスにとってはprivateです。これはpackage visibilityまたはfriendly visibilityと呼ばれることもあります。

それでは、accessorメソッドの適切なvisibilityは、どのように決めたらよいのでしょうか? 私の経験では、常にaccessorをprotectedにして、サブクラスだけがその属性にアクセスできるようにするように努めるべきです。サブクラスがその属性にアクセスする必要がない場合には、accessorをprivateにするようにしてください。外部クラスまたはオブジェクトが属性にアクセスする必要があるときにかぎり、該当のgetterまたはsetterをpublicにしてください。対応するgetterメソッドとsetterメソッドのvisibilityが異なることはよくあります。Seminar クラスでは、getTitle() メソッドのvisibilityがpublicになっていて、setTitle() メソッドのvisibilityがprivateになっています。図1に示されているように、このsetterメソッドが呼び出されるのは、セミナーの名称の形式 (コース番号、セミナー番号、およびコース名の組み合わせ) を決めるためのgetter内だけです。


図1.Seminar クラスの name 属性に関するgetterおよびsetterメソッド
                
   /**
    * Returns the title of the seminar.
    * The seminar title is the concatenation of the course number (CCC),
    * the seminar number(SSS), and the name of the course(NNN) in the
    * format "CCC-SSS NNN"
    *
    * @return String Title of the seminar
    * @modifies yes Initializes the title of the seminar if not yet defined
    * @example "CSC 158-2 Introduction to Java Programming"
    */
    public String getTitle()
    {
        String newTitle = new String();
    if ( name == null) {
    // Build the name
    newTitle += course.getNumber() + " ";
    newTitle += getNumber();
    newTitle += " " + course.getName();
    setTitle(newTitle);
    }
    return this.title;
    }
    /**
    * Sets the title of the seminar
    *
    * @param title
    *
    **/ 
    private void setTitle(String title) 
    {
    this.title = title;
    }

必ずしもすべてのaccessorをpublicにする必要がないことを理解することが大切です。ユーザーが適切と判断したvisibilityを定義することができます。残念なことに、このアドバイスはbean以外のJavaクラスにしか当てはまりません。2.x EJB仕様により、Enterprise JavaBean (EJB) のパーシスタント特性のaccessorと同様に、public JavaBean特性を表すaccessorはpublicでなければならないとされているからです。JavaBeanのaccessorメソッドにpublic visibilityを指定しないこともできますので、注意してください。ただしその場合には、それらのaccessorによってカプセル化された属性が、そのbeanのパブリック・インターフェースを介してアクセスすること (これは、まず第一に達成したいことではないかと思われます) ができなくなります。同様に、EJB accessorメソッドをpublicにしないと、それらのaccessorによってカプセル化された属性は持続させることができなくなります。

話題が変わりますが、図1におけるgetTitle() というgetterのインプリメンテーションは、無精な初期化 の例です。この方法を使用した場合、属性の値は、その属性が最初にアクセスされるときに初期化 (設定) されます。この方法の便利な点は、値を入手するための費用負担が、値を必要とするときだけで済むということです。一見すると、この程度のことでは、セミナー名の判別の際にコストがたいして節約できるとは思えないかもしれません。しかし、コース・オブジェクトが別のサーバーに常駐していて、それをパーシスタント記憶域から読み出して、その名前をネットワーク経由で伝送する必要がある場合には、無視できない効果が現れます。無精な初期化の主な欠点は、コードが複雑になることです。これは、該当の属性が定義されているかどうかを検査しなければならず、さらに、まだ定義されていない場合にはその値を入手する必要があるからです。無精な初期化は、一般には、属性の計算または入手に必要なコストが高く (属性が大きく、ネットワーク経由での伝送にかなりの時間を要する場合など)、また、そのオブジェクトをメモリーに記憶するたびに必ずしも属性が必要にはならない場合に使用されます。

図1のsetTitle() というsetterのインプリメンテーションは、命名規則の観点から見て興味深いものです。このトピックについては、"Java 命名規則" で取り上げたことがあります。パラメーターの名前は、インスタンス属性 (フィールド) 自体の名前と同じになり、この例ではtitle となります。これは、いわゆる命名衝突 ですが、幸いなことに、インスタンス属性の前に "this." を付けることによって解決できます。この場合には、テキスト・パラメーターにaTitlenewTitle のような別の名前を使用しておけばよかったのかもしれません。こうしておくだけで、最初からこうした問題が起こらないようにできます。


参考文献

accessorメソッドおよびvisibilityの詳細については、以下を参照してください。

著者について

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

不正使用の報告のヘルプ

不正使用の報告

ありがとうございます。 このエントリーは、モデレーターの注目フラグが設定されました。


不正使用の報告のヘルプ

不正使用の報告

不正使用の報告の送信に失敗しました。


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, Java technology
ArticleID=244756
ArticleTitle=Java accessorのvisibility
publish-date=10192000
author1-email=scott_ambler@ca.ibm.com
author1-email-cc=

タグ

Help
このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。

スライダーバーを使用することで、より多く(少なく)タグを表示します。

人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。

マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。

このタグで、My developerWorks のすべてのタイプのコンテンツを見つけるために検索フィールドを使用します。人気のタグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するトップのタグを表示します。マイ・タグは、この特定のコンテンツ・ゾーン(例えば、Java テクノロジー、Linux や WebSphere など)に対するお客様ご自身のタグを表示します。