[PR] 迷惑メール トップページプロ3ゼミJavaJava入門講座二学期単位7 →1時間目

1時間目 アクセス修飾子

7−1−1.プライベートフィールド

 単位6でクラスを学んできましたが、そこで「クラスは、メソッドを返して操作をする」と教えました。
フィールドは直接アクセスせずにメソッドを使おうとも教えました。
と言ってもアクセス出来てしまう訳ですから、本Webのように学んだ人がプログラミングをすればいいですが、 時には、知らない人又は忘れてアクセスするかもしれません。
又、時と場合によってはフィールドにアクセスしてもいいよと言う時にはそれが区別できません。

 このような、オブジェクト指向の考え方からJavaでは「アクセス修飾子」を使います。
アクセス修飾子は、アクセスするレベルを設定します。
「修飾」と言う言葉からも分かるようにアクセス修飾子は、プログラマが宣言できる物に付ける事が出来ます。
クラス、メソッド及びフィールドです。

 よって、フィールドを呼び出し元からアクセスされたくなければ、アクセス修飾子を使い制御すればいいの です。
フィールドの宣言で「private」を設定すれば、フィールドは自分のクラス以外からはアクセスできません。
「private」はキーワードですので、単体でクラス名、メソッド名及びフィールド名には使えません。

 キーワードが次から次へと出てきますが、初めから覚える必要はありません。
分からなければ、その都度見ればいいからです。
キーワードを覚え出せなくてもその機能がある事又はキーワード1つ1つの違いを知っている方が重要だからで す。

 以下のサンプルプログラムをご覧下さい!

Sample7_1_1.java
// 本クラス
class PrivateBook {

    private String  title;      // タイトル
    private String  author;     // 著者
    private String  translator; // 訳者
    private String  publisher;  // 出版社
    private String  isbn;       // ISBN

    // 本を取得
    PrivateBook get() {

        // 同じクラスからはアクセスできる
        PrivateBook objBook = new PrivateBook();
        objBook.title = "人月の神話 狼人間を撃つ銀の弾はない";
        objBook.author = "フレデリック・P・ブルックス, Jr.";
        objBook.translator = "滝沢徹・牧野祐子・富澤晃";
        objBook.publisher = "ピアソン・エデュケーション";
        objBook.isbn = "4-89471-665-8";

        return objBook;
    }
}

public class Sample7_1_1 {

    public static void main(String[] args) {

        PrivateBook objBook = new PrivateBook().get();

        // アクセスできない
        // System.out.println("タイトル:" + objBook.title);
        // System.out.println("著者:" + objBook.author);
        // System.out.println("訳者:" + objBook.translator);
        // System.out.println("出版社:" + objBook.publisher);
        // System.out.println("ISBN:" + objBook.isbn);
    }
}
  


 サンプルプログラムでは、アクセスできない為にコメントにしていますが、コメントをはずすとコンパイル エラーです。

7−1−2.カプセル化

 private宣言したフィールドは外からアクセスできないのでクラス内から設定しなければなりません。
よって、メソッドはフィールドとは違い公開しなくてはいけません。
このような概念をカプセル化と言います。
カプセル化は、直接フィールドにアクセスさせない事により、変な値を設定させない事ができます。
公開は、「public」を付ける事によりアクセス修飾子が無い時より広くアクセスされる事が許されます。

 反対に、公開したくないメソッドもあります。
公開したくないメソッドは、公開する必要が無いメソッドも含まれます。
例えば、内部計算等は、公開する必要が無いです。
メソッドだからと言って公開する必要はありません。
メソッドの公開は、フィールドに直接アクセスできない為(実際はアクセスさせない為)にしているので、そ の事が分かってくると公開すべきメソッド又は公開する必要が無いメソッドの区別が出来るようになります。

 サンプルプログラムをご覧下さい!

Sample7_1_2.java
// 本クラス
class PublicBook {

    private String  title;  // タイトル
    private String  isbn;   // ISBN

    // タイトルを返す
    public String getTitle() {

        return title;
    }

    // タイトルを設定
    public void setTitle(String title) {

        this.title = title;
    }

    // ISBNを返す
    public String getIsbn() {

        return isbn;
    }

    // ISBNを設定
    public void setIsbn(String isbn) {

        this.isbn = isbn;
    }

}

public class Sample7_1_2 {

    public static void main(String[] args) {
        
        PublicBook objBook = new PublicBook();
        objBook.setTitle("Java言語で学ぶデザインパターン入門");
        objBook.setIsbn("479732703");

        System.out.println("タイトル:" + objBook.getTitle());
        System.out.println("ISBN:" + objBook.getIsbn());

    }
}
  
タイトル:Java言語で学ぶデザインパターン入門
ISBN:479732703

 Sample7_1_2.javaは、オブジェクト指向及びJava主義に合った記述です。
このSample7_1_2.javaでは、カプセル化する必要があるのかと思うもしれませんが、この状態だけは特に意味はあ りません。
但し、プロジェクトが進行中の時には、クラスを含めメソッド又はフィールドを変更する必要が出てくる事は 多々あります。
フィールドは非公開でメソッドは公開されているのでフィールドを途中で変更しても、呼び出し元には影響を 当てる必要が無くなり保守性が向上します。
メソッドの処理が変更されても呼び出し元には影響しません。

 例えば、Sample7_1_2.javaでISBNの登録を数字と「‐」だけ入力可能にしようとする場合でも変更する箇所は、 「setIsbn(String)」メソッドの処理だけ変更すれば済みます。
又、このようにフィールドに代入する前に、一旦メソッドを踏むからこそ入力制限及び保守性が向上するので す。
これこそが、カプセル化のメリットであり特徴です。


単位7 クラスの特徴に戻る     2時間目 オーバーロードに進む

単位7 クラスの特徴に戻る

トップページに戻る