【改訂版】Eclipseではじめるプログラミング
連載インデックスへ
【改訂版】Eclipseではじめるプログラミング(14)

再利用性の高いクラス作成に重要な“アクセス制御”


株式会社ガリレオ
小山博史
2010/1/28


生成されたアクセサメソッドをソースコードで確認

 この機能を使って生成されたアクセサメソッドを持つクラスは、下記のようになります。

  sample14/app5/UserInfo.java
package sample14.app5;
 
class UserInfo {
    private String name;
    private String eMail;
    private boolean member;
 
    public String getName() {
        return name;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public String getEMail() {
        return eMail;
    }
 
    public void setEMail(String mail) {
        eMail = mail;
    }
 
    public boolean isMember() {
        return member;
    }
 
    public void setMember(boolean member) {
        this.member = member;
    }
}

コラム 「JavaBeansコンポーネントアーキテクチャと“属性”」

Javaでは、「JavaBeansコンポーネントアーキテクチャ」といわれるものがあり、このコンポーネントアーキテクチャを採用している環境では、オブジェクトの属性はアクセサメソッドで表現します。

UserInfoクラスは、属性name、email、memberが定義されていて、属性nameの値はgetNameメソッドで取得できますし、setNameメソッドで設定できるということです。

フィールドを保護する! protected宣言とは

 最後に、protected宣言されたフィールドを持つクラスも作成してみましょう。次のように、protectedなString型のフィールド「f1」を持つSampleクラスを作成してみます。

  sample14/app6/Sample.java
package sample14.app6;
public class Sample {
    protected String f1;
    private String f2;
}

 Sampleクラスを拡張するSample1クラスを次のように作成します。f1についてはprotectedなので、Sample1クラスで利用できることが分かります。しかし、private宣言されたフィールドf2はSample1クラスでは利用できません。すなわち、コメント部分を有効にすると、エラーになります。

  sample14/app6/Sample1.java
package sample14.app6;
public class Sample1 extends Sample {
    public void setF1(String f1) {
        this.f1 = f1;
    }
    public String getF1() {
        return f1;
    }
  
    /* f2はprivateフィールドなので使えません
    public void setF2(String f2) {
        this.f2 = f2;
    }
    public String getF2() {
        return f2;
    }
    */
}

 SampleクラスとSample1クラスを利用するAppクラスを次のように作成します。f1についてはprotectedなので、同一パッケージであるAppクラスで利用できることが分かります。しかし、private宣言されたフィールド「f2」はAppクラスから利用できません。

 なお、Sample1がSampleから実装継承したフィールド「f1」についても、同じアクセス制限が適用されるため、Appからアクセスできます。

  sample14/app6/App.java
package sample14.app6;
public class App {
    public static void main(String[] args) {
        Sample sample = new Sample();
        sample.f1 = "f1";
        System.out.println(sample.f1);
        // sample.f2 = "f2"; // privateなフィールドは使えない
        Sample1 sample1 = new Sample1();
        sample1.f1 = "f1";
        System.out.println(sample1.getF1());
    }
}

 packageが別になると、protectedなフィールドであるf2も使えなくなるので、sample14.app7.Appクラスでは、sample14.app6.Sampleクラスのf1へは直接アクセスできません。しかし、sample14.app7.Sample1のsample14.app6.Sampleを拡張した場合は、f1へアクセス可能です。

  sample14/app7/Sample1.java
package sample14.app7;
import sample14.app6.Sample;
 
public class Sample1 extends Sample {
    public void setF1(String f1) {
        this.f1 = f1;
    }
    public String getF1() {
        return f1;
    }
}

  sample14/app7/App.java
package sample14.app7;
public class App {
    public static void main(String[] args) {
        sample14.app6.Sample sample = new sample14.app6.Sample();
        // sample.f1 = "f1"; // ほかのパッケージ内クラスのprotectedなフィールドは使えない
        Sample1 sample1 = new Sample1();
        System.out.println(sample1.getF1());
    }
}

アクセス制御はクラスの設計時に考慮するべき

 今回は、アクセス制御について説明しました。あるクラス内のデータ構造にほかのクラスが依存してしまうと、そのデータ構造を変更するときに大きな影響があることから、ほかのクラスが使用する必要がないフィールドやメソッドについては、アクセスできないようにすることは理解できたでしょうか。

 ほかのクラスに使用してもらうフィールドやメソッドについては、publicキーワードを付け、自分のクラスでしか使用しないフィールドやメソッドについては、privateキーワードを付けるという基本を身に付けてください。アクセス制御のためのキーワードを付けたり、protectedキーワードを付けたりするクラスを設計することは、初心者のうちはあまりないかもしれませんが、文法的な意味はきちんと理解して、使えるようにしておきましょう。

  今回作ったサンプルのソースコードはこちらからダウンロードできます。

@IT関連記事


クラスのメンバに利用制限を付与するアクセス制御
[連載]いまから始めるJava(9) 
外部から勝手にデータを変更されたり、参照されることからクラスのメンバを守るためには、アクセス制御を活用します
Java Solution」フォーラム 2003/9/17
JavaBeansのJavaBeansたるゆえん
やり直し「JSPとTomcat」(7) Java開発においてもはや常識の感があるJavaBeans。しかし、その定義やルールについて説明するとなると…。1度おさらいをしてみよう
Java Solution」フォーラム 2006/11/11
アクセス制御を習得する
ソースコードで学ぶ SJC-P 5.0 ドリル(9) 
public、privateなどのアクセス修飾子は、コンストラクタ、変数など種類によって適用個所が違う! どう使い分ければいいの?
Java SE コアAPI 使用コード例一覧
Java開発者/プログラマのための、Java SEコアAPIの使用コード例の記事へのJavadocっぽいリンク集。メソッドやコンストラクタ、例外などAPIの使い方の参考にしてください
Java Solution」フォーラム 2009/3/24
ActionScriptで学ぶクラスやオブジェクト指向の基礎
Flashの基礎を無料で習得! ActionScript入門(4) 本格的なオブジェクト指向言語となったActionScript 3.0を通じてクラスやフィールド、メソッドなどの基本を学びましょう
リッチクライアント & 帳票」フォーラム 2008/4/9
第3章 C#におけるクラスとインスタンス
連載:改訂版 C#入門
 C#を使いこなすためには、「オブジェクト指向」という考え方を把握する必要がある。今回はその中核となる「クラス」と「インスタンス」について解説する
Insider.NET」フォーラム 2002/9/4
VB.NETにおける継承とポリモーフィズム
連載:改訂版 VB.NETプログラミング(10) 
VB.NETを使いこなすうえで最大の難所ともなるポリモーフィズム。サンプル・プログラムによる実例を示しながら、その真価を探る
Insider.NET」フォーラム 2004/6/24

筆者プロフィール
小山博史(こやま ひろし)
情報家電、コンピュータと教育の研究に従事する傍ら、オープンソースソフトウェア、Java技術の普及のための活動を行っている。長野県の地域コミュニティである、SSS(G)bugs(J)の活動へも参加している。
著書に「基礎Java」(インプレス)、共著に「Javaコレクションフレームワーク」(ソフトバンククリエイティブ)、そのほかに雑誌執筆多数。

1-2-3
 

 Index
第14回 再利用性の高いクラス作成に重要な“アクセス制御”
  Page1
クラスの実装に修正が入ったときの影響
ユーザー情報を管理するサンプルから考える
  Page2
Javaのアクセス修飾子は、3種類
コラム 「Javaには“ネストされたクラス”ってのもあります」
アクセス修飾子でクラス依存を解決するには
アクセサメソッド「getter」「setter」とは
Page3
コラム 「JavaBeansコンポーネントアーキテクチャと“属性”」
フィールドを保護する! protected宣言とは
アクセス制御はクラスの設計時に考慮するべき

【改訂版】Eclipseではじめるプログラミング バックナンバー 連載インデックスへ»



Java Solution全記事一覧

TechTargetジャパン

Java Solution フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

キャリアアップ

- PR -
@IT Sepcial

イベントカレンダー

PickUpイベント

- PR -
もっと見る
- PR -

お勧め求人情報

ホワイトペーパーTechTargetジャパン

@IT Sepcial
ソリューションFLASH