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

9-7 【コンストラクタでセッタを利用する】

 また,セッターは担当するフィールドに適切な値が設定されるようにチェックをする役目を持つ事が多い。上図のAccessor2.javaの例では,setAge( )
メソッドとsetGender( )メソッドで,それぞれフィールドに代入される値として渡された実引数の値が適切かどうかチェックをしている。
そのため,コンストラクタの初期化処理でも,こうした値のチェックを行うセッタを利用すると良い。この方針に従い,Accessor2.java を書き換えた例を
以下に示す。コンストラクタの初期化処理で setAge( ) と setGender( ) を呼び出している(☆と★の箇所)。

Accessor2.java


なお,ここではコンストラクタに負の年齢値や性別値として不正な値を実引数として渡してオブジェクトを初期化するとエラーメッセージ
を表示して,Person1型オブジェクトのフィールドは適切な初期化が行われないままになってしまう。

そもそも適切な値で初期化されないままオブジェクトを利用するのは危険なので,本来であれば
 ・なんらかの特別な処理に移行して,適切な値に初期化されるように再チャレンジする
 ・他のサービスに影響の無いようにこのプログラムを終了する。
といった処置が必要になってくる。このような処置を扱うためには,後期に学習する「例外」という仕組みを知る必要がある。
学習中の皆さんは,とりあえず上記の例のようにエラー表示などで対処しておくようにしておけばいいだろう。



9-8 【Meibo.javaの改良版】


・Meibo.javaのPersonクラスに適切なアクセッサを設けた例を以下に示す。黄色で示したところがアクセッサの定義とその呼び出し箇所である。

改良版その2Meibo.java

※PersonのセッタsetAge( ),setGender( )では実引数の値が適切かどうかをチェックしてからフィールド
 の値をセットしていることに注意。適切な値でない場合,エラーメッセージを表示するようにしても良いだろう。
※Personのコンストラクタの中でもセッタを利用している。これによって,初期化値が適切かどうかのチェック
 ができる。

 さて,フィールドを privet指定にして適切にアクセッサを追加した 改良版その2Meibo.java を,メンバmを勝手
にいじろうとしていた AttackMeibo.java

とともに実際に動かそうとすると,コンパイル時に次のようにエラーが1個表示されてコンパイルに失敗する。
つまり,不正な操作をしっかり防げたことになる。

AttackMeibo.java:5: num は Meibo で private アクセスされます。
 m.num = 10; // 登録数をむりやり上限値に設定してしまう
                     ^

以下に,オブジェクト指向の鉄則・常識を示す。
※フィールドは必ず private に指定する
※クラス外部からフィールドを参照したり操作する場合は,必要に応じて専用のメソッド(アクセッサ, accessor)を用意すること



第10回の内容へ進む