プログラミング応用a 第9回 『モジュール化その1 (メンバアクセス制御とアクセッサ)』 |
前述したように,フィールドは原則的にprivateにして,クラスの外部からアクセスできないようにすべきである。
そのため,クラスの外部からフィールドの値を変更したり,フィールドの値を参照(利用)させることを許可したい場合
には,そのための専用のメソッドを用意する。このようなフィールドにアクセスするための専用のメソッドを
アクセッサ(accessor)
と呼ぶ。特に,フィールドに値を設定(代入)するアクセッサをセッタ(setter),フィールドの値を返すメソッドをゲッタ(getter)
と言う。
アクセッサの考え方・定義方法を下図に示す。
次に,アクセッサの例を2つのソースで示す。最初のソース(Accessor1.java,下図)を見て欲しい。このクラス
自体は,純粋に説明のために定義したもので,何かを表しているわけではない。ここでは,クラスAが定義されて
おり,int 型フィールドiは 0 以上でなくてはならないとする(下図①)。i はフィールドなのでprivate指定している
ことに注意。クラスAには,フィールド i へアクセスするためのアクセッサが2つ用意されている。
②のメソッドgetI( )は, i の値を返してくれるゲッタである。
また,③のメソッド setI( ) は, i に値を設定するセッタである。setI( ) は,渡された実引数の値をiに代入するが,実引数が
負の値である場合は,i の値を変更しない。このようにして,setI( ) は「フィールドiの値は 0 以上でなくてはならない」
という条件が常に成立するように,クラスAのオブジェクトを守っているのである。
下図のAccessor1.java の main( )メソッドを見てみよう。
・④では,セッタ setI( ) を使い,A型オブジェクトaのフィールド i の値を10に設定している。
・⑤では,ゲッタ getI( ) を使用してフィールドiの値を取り出して表示するので,10と表示される。
・⑥では,またセッタ setI( ) を呼び出してフィールドiに -10 を設定しようとしているが, setI( ) は負の値が
実引数に渡された場合には i の値を変更しないので,⑦で i の値を表示しているところでは,やはり 10 と表示される。
Accessor1.java
次に,今まで頻出してきたPersonクラスにprivate指定とアクセッサを追加した例を示す(Accessor2.java下図)。
ちゃんと,フィールドageとgenderはいずれもprivateになっている(下図①,②)。これらのフィールドへのアク
セッサが下図③〜⑥である。2つのセッタはいずれも実引数の値が適切なときだけフィールドに実引数の値を代
入している。talk( )メソッドのなかでは,2つのセッタを利用してフィールドの値を取り出している(下図⑦,⑧)。
Accessor2クラスのmain()メソッドでは,2つのセッタを使って各フィールドの値を変更しているが,不正な値は
検知されて無視される(下図⑨,⑩)。
Accessor2.java
※クラスのフィールドを private 指定して他のクラスから勝手に直接いじられないように保護しつつ,更にアクセッサを設けることで,
適切な操作はアクセッサを介して行って貰うようにして,上図の例の setAge( ) や setGender( ) のように,不正な値がフィールド
に代入されそうになっても,それを事前にチェックし防ぐ機会を設けることができるわけである。