#はじめに
現在Javaを学習しており、継承についての記事を書こうと思っていたが、書いている途中でgetter setterの説明ができないことに気づき急遽題材を変えてこの記事を書くことにした。
#存在意義やその定義
カプセル化する際、フィールドを全てprivate にすると外部からの読み書きが一切できなくなる。そこで登場するのがgetter setterである。言い換えると本来アクセスできないはずのprivateフィールドに、getter setterを経由してアクセスすることができるようになる、と言うことである。
また、『外部から自由に読めるようにしたいが、内容を書き換えられると困る』際に使われたり、将来的に何らかの理由でフィールド名を変更したい時( 例えばname から names )に、変更がしやすいといったメリットもある。
●getterメソッドの定石
public フィールドの型 getフィールド名( ) {
return this.フィールド名;
}
●setterメソッドの定石
public void setフィールド名 (フィールドの型 任意の変数名) {
this.フィールド名 = 任意の変数名;
}
それぞれについて具体的なコードを書きながら見ていこう
#"getter" を使ってみよう
//Humanクラス
public class Human {
void eat (Noodles r) {
System.out.println (r.name + "を食べた");
}
}
//Noodlesクラス
public class Noodles {
private String name = "ラーメン";
//nameフィールドが private によって他(ここではHuman)クラスからは見えない
}
上記の例だと、次のようなコンパイルエラーが発生。
######結果
name は Noodles で private アクセスされます
エラー文の意味... name は private によって外部からアクセスできない
そこで、Noodles クラスに getName メソッドを追加して、Human (人間) がNoodles (麺) の名前、言い換えると name フィールドの値、を知ることができるようにする。
//Humanクラス
public class Human {
void eat (Noodles r) {
System.out.println (r.getName() + "を食べた"); //修正箇所 --①
}
}
//Noodlesクラス
public class Noodles {
private String name = "ラーメン";
public String getName() { //修正箇所
return this.name; //--②
}
}
上記の getter メソッドでは何をしているかというと、外(ここでいうHuman)のメソッドから getter を呼び出し(--①)、その戻り値として Noodles クラスの name フィールドの値を戻し(--②)ている。
#"setter"を使ってみよう
//Humanクラス
public class Human {
void eat (Noodles r) {
r.setName("うどん"); //--③
}
}
//Noodlesクラス
public class Noodles {
private String name = "ラーメン";
//setterメソッドを追加
public void setName(String name) {
this.name = name;
}
}
上記の setter メソッドでは何をしているかというと、Noodles クラス内に setter メソッドを定義し、外部から呼び出す(--③)ことによって、引数にした値を代入(ラーメン から うどんに値を書き換え)している。
#まとめ
ここまで getter setterの記事を書いてきたが、実はこの2つは無いのが理想的である。特にsetterに関してはメソッドを呼び出す手間を加えることによって値を変更できるので、使わない方が良い。getter に関しても、ほぼ参照しているだけだが使わない方が良い。らしい。
ではここで、 private の中の値を知りたい時どうすればいいのか?と言う疑問が生まれるが、それについては追々記事にできたらな、と。
現在勉強中の身ということもあり、間違ってる箇所もあるかと思いますがその時は教えていただけますと幸いです。