筋トレLOVEな文系女学生のJava入門_カプセル化_getterとsetter


はじめに

好きな人とドライブする際・・・ 緩めのスピードで走行するのがおすすめ
理由としては、小刻みな特定周期の振動・ほんの少し触れれている感じは女性に強烈な快感を与えるからです。
地面のちょうどいい振動とカーブを曲がる時の重力とかが合わさって女性に快感を与えることが研究で発表されているそうです。これで している時と同じ快感を与えることができるんですって

超会議の超チャンネル生放送2016っていうブースでメンタリストDaiGoが上記のことを話していました

今回はgetterとsetterについでです。
独学でやってるので、「これはJavaやっていくにあたって役に立つ知識だぞ!!」というのがあれば、コメントして頂けるととても嬉しいです

getterメソッド

getterメソッドとは、ある特定のフィールド値を取り出すためのメソッド
privateなフィールドの値をgetすることができる

gettrメソッドの定石
public 値を取り出すフィールドの型 getフィールド名() {
return this.フィールド名
}

MuscleBoyクラスにgetNameメソッドを追加して、MuscleGirlがMuscleBoyの名前を知ることができるようにしてみる!

1 public class MuscleBoy{
2   private String name;
3
4   public String getName(){
5     return this.name;
6   }
7 }

MuscleGirlクラスでは、nameフィールドにアクセスしている部分をgetName()で呼び出す

1 public class MuslceGirl{
2   void talk(MuscleBoy mb){
3     System.out.println("ねぇねぇ" + mb.getName() + "君、私と一緒に筋トレ・・・しない??");
4   }
5 }

MuscleBoyクラスのgetNameメソッドを経由してnameフィールドにアクセスし、値を取り出しているのじゃ

setterメソッド


setterメソッドは、ある特定のフィールドに指定された値を代入するメソッド
privateなフィールドの値を書き換える

setterメソッドの定石
public void setフィールド(フィールドの型 任意の変数名){
this.フィールド = 任意の変数名;
}

1 public class MuslceBoy(){
2  private String name;
3
4   public String getName(){
5    return this.name;
6   }
7
8   public void setName(String name){
9    this.name = name;
10  }
11 } 

getter/setterのメリット


1.Read Only Write Onlyが可能
getNameのみ:外部から読めるが書き換えることはできない
setNameのみ:外部から書き換えることはできるが読めない(あまり使われていない)

2. クラスの内部設計を自由に変更できる
たとえば、何らかの理由でnameというフィールド名をnewNameに変更したくなったとき、getter/setterを使っている箇所だけ修正すればオッケー

3. フィールドへのアクセスを検査できる
クラス外部からnameのフィールドの値を変更したい場合、setterを使う。
要は、「setterを実行せずに、nameフィールドに値を変更することはできない」
このことを利用して、setterで設定されようとしている値が妥当かどうかを検査することもJavaプログラミングの定石

1  public class MuscleBoy(){
2   private String name;
3   public void setName(String name){
4     if(name == null){
5       throw new IllegalArgumentException("名前が入力されていません。処理を中断。");
6     }
7     if(name.length() <= 1){
8       throw new IllegalArgumentException("名前が短すぎます。処理を中断。");
9     }
10    if(name.length() >= 10){
11      throw new IllegalArgumentException("名前が長過ぎます。処理を中断。");
12    }
13    this.name = name;     //検査完了。代入しても問題ない!
14 }

throw new IllegalArgumentExceptionはエラーを出してプログラムを強制停止する命令

このsetName()メソッドは、nameフィールドの値を変更するたびに検査を行う。
もし問題のあるプログラムを実行するとプログラムは処理を中断するのじゃ

1  public class Main{
2   public static void main(String[] args){
3     MuslceBoy mb = new MuscleBoy();
4     mb.setName("");   //長さ0文字の名前をセットしようとしている
5   }
6 }

画面には、名前が入力されていません。処理を中断。と表示される