privateフィールドの書き換え〜 getter/setterメソッド
〈フィールドを書き換えたい時〉
class Hero{
private int hp;
hpフィールドは他のクラスからはアクセス出来ないが、
同じクラス内のattack( );やsleep( );のようなメソッドからであれば
アクセス(書き換え)が出来る
→この場合は、通常通り this.hpで書き換え
もし他のクラスからhpフィールドを書き換えたい時は
同じクラスのメソッドを経由してから書き換え
具体的には2つの手順を踏む
STEP1: hpフィールドが所属するクラスにhpフィールドを書き換えるメソッドを新しく作る(privateは同じクラスからなら、アクセスOK)
STEP2: そのメソッドを他のクラスから呼び出す
※ 基本的にはフィールドは全てprivateで、
他クラスからの書き換えはメソッド経由で行う
ex. nameのような何度も他のクラスからも呼び出す情報(フィールド)をprivateにしても、メソッド経由で呼び出せるようにしておけば不便にはならない
class Hero{
private String name; //勇者の名前フィールド
}
class King{
public void talk(Hero h){ //勇者と話すメソッド
System.out.println(h.name+"さん、ようこそ");
}
↑これだと、nameにはprivate(他クラスからアクセス不可)がついているので、エラー
⇩
そこで、Heroのクラス内にnameフィールドを書き換えることが出来るように
getNameメソッドを追加し、Kingクラスも合わせて変更する
class Hero{
private String name;
public String(戻り値の型) getName( ){ //nameにアクセスするメソッド
return this.name;
}
}
class King{
public void talk(Hero h){ //勇者と話すメソッド
System.out.println(h.getName+"さん、ようこそ");
}
ここで記述したgetName( )は単に自分自身のクラスのフィールドの中身を呼び出して、getName( )を呼び出した他のクラスに返すだけのメソッド
→getterメソッド
〈getterメソッドの構文〉
public アクセスしたいフィールドの型 getフィールド名( ){
return this.フィールド名;
}
この他にアクセスしたいフィールドの値を書き換えるだけのメソッド
→setterメソッド
〈setterメソッドの構文〉
public void set アクセスしたいフィールド名(フィールドの型 フィールドの変数名){
this.フィールド名=変数名;
}
ex.
1.setterメソッドを含めた勇者クラスを定義する
class Hero{
private String name; //名前フィールド
Hero(String name){//コンストラクタ(最初に自動で入れる値)
this.name=name
} ;
public void setName(String name){ //名前フィールドを書き換えるメソッド
this.name=name;
}
}
2. 勇者インスタンスを作り、名前を書き換える
class Main{ //指示クラス
public static void main(String[ ] args){
Hero h=new Hero(太郎);
//コンストラクタが実行され、nameには自動的に"太郎"が入る
Hero.setName(新太郎);
//setterメソッドでprivateフィールドの太郎→新太郎へ書き換え
}
☆ gettter/setterメソッドを使うメリット
① getterメソッドを削除すれば、外部クラスからは呼び出すことの出来ないフィールドに(Write Only)、
setterメソッドを削除すれば、外部からは書き換えることが出来ないフィールドになる(Read Only)
② クラス内部でフィールドの変数名を変更したとしても、それを呼び出している外部のフィールドは何もコードの変更をしなくても大丈夫
ex. Heroクラスでフィールドの変数名をname→newNameへ変更
外部クラスのgetNameとsetNameは、アクセス先がname→newNameに単に変更されるだけなので、特に書き換えなくてOK
もしgetter/setterがなければ、他クラスに記述されている変数名全てを書き換えなければいけない
③ setterメソッドの中に条件式を記述しておけば、
他のクラスからsetterメソッドを使ってフィールドの値を書き換えたい時に、その条件に合わないものはエラーにすることが出来る
「setterを実行せずにフィールドの情報を書き換えることは不可能なので、
必ず外部からのフィールドの変更はsetterを経由する」という前提があるので、
このようなことが可能
ex. public void setName(String name){
if(name.length( )<=1{
(↑条件式で名前が1文字以下のものは入力できないように指定)
//エラー表示("名前が短すぎます")
}
this.name=name;
}