プログラミング応用a 第9回 『モジュール化その1 (メンバアクセス制御とアクセッサ)』  

9-3 【メンバを保護する理由】

●例として:名簿を表すクラス

まず,今回のテーマ『正常に動作するには,変数(フィールド)を外部から守らなくてはならない。』を確認するために,実際の例を見てみよう。

Person型オブジェクトを登録する名簿を考えてみる。ここでは,名簿を表すクラスを Meibo クラスとする(下リスト Meibo.java)。
Meibo.java

※Meiboクラスのmaxnumフィールドにはfinalという指定がついている。final指定付きで宣言されたフィールドは,それ以降値の変更ができなくなる。
 つまり,final指定されたフィールドは定数になるわけである。これを,一般に final定数と呼ぶ。

この名簿クラス Meibo をテストするクラス
MeiboTest01.java

※Eclipse で Java用プロジェクトを作成し, 上記の Meibo.java と  MeiboTest01.java をそのプロジェクトに追加して,実際に動かし,
 その動きを理解しよう。 ちなみに,実行結果は下図のようになる。

実行結果は以下の通り。


さて,次にこのプログラムを少しいじってうまく動かないようにしてみよう。


9-4 【メンバを不正操作されると…】

 この名簿クラスのメンバが外部から勝手にいじられると,名簿クラスは正常に動作しなくなってしまう。その例が AttackMeibo.java (下図)である。

AttackMeibo.java


・この実行結果から,2個目のPerson型オブジェクトが登録できないというバグ(不良動作)が生じている。
・このバグは,1個目の Person型オブジェクトを登録した後, Meibo型オブジェクトmのフィールド num を勝手に 10 に書き換えてしまった(上図の黄色部分)ために起こっている。
・このように,このままではクラスやオブジェクトのメンバが勝手にいじられて,クラスとそのオブジェクトの機能が簡単に阻害される可能性があることがわかる。
・もちろん,上図のように重要な変数の値を勝手に変えないように注意してプログラムを作成すれば良いのだが,ソフトウェア開発は複数人で行うこともあり,プログラム作成担当者が変われば,
 この手の注意点は忘れられてしまうかもしれない。
・そこで,Javaには,クラスのメンバを他のクラスのメンバから利用することを禁止する手段が用意されている。次にその具体的な方法を紹介する。

次へ進む