クラス内のデータへのアクセス制御

private や protected のモードの意味と使用例を解説します。
private や protected で宣言されたフィールド(変数)やメソッドは、 他のクラスからのアクセスに制限されます。 (protected の場合には、そのサブクラスおよび同一のパッケージ内のクラス からはアクセスすることが許されます。)
このことを、サンプルのゲームのプログラムの中の クラス Block を例にとって調べてみましょう。 このクラスは、落下中のブロックを表します。 従って、Cellのデータ及び、ブロックの位置の情報を内部に持っています。 また、ゲームの途中でブロックの位置を操作するためのメソッドも用意されています。


/** 落下するブロックBlockクラス */

public class Block {

    /** ブロックの位置 */

        protected int x, y;
                 :
                 :
    /** ブロックのX座標を設定するメソッド */

        public void setX( int x ){  this.x = x;  }

    /** ブロックのX座標を得るメソッド */

        public int getX(){  return x;  }
                 :
                 :

ブロックの位置を記憶するフィールドは protected で宣言されています。 これらのフィールドは他のクラスのプログラムの中で直接 block.x のような 形式でアクセスすることはできません。その代わり、public なメソッド を利用します。つまり、フィールドのデータは完全に隠されているわけではなく、 「正規の手続き」を利用すればアクセスできるわけです。


        Block block;

        block.x = 20;    // 不正なアクセス(コンパイル・エラーとなる)
        block.setX(20);  // 正しいアクセス

このような形式は一見すると単にプログラムの記述を不必要に増やしているだけの ように思えるでしょう。しかしプログラムの規模が大きくなってくると、 上のような記述はプログラムを見やすくし、バグを未然に防ぐという効果を生みます。
また、アクセスの形態も工夫することができます。 たとえば上の例で setX() をわざと定義しないようにすれば、 外部からは「読みとり専用」のデータを定義できたことになります。