16
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

アイエンター #2Advent Calendar 2018

Day 12

そもそもsetter/getterはなぜ必要なのか

Last updated at Posted at 2018-12-12

setter/getter使いますよね。。

ふとsetter/getterがなぜ必要なのかを
・setter/getterは何なのか
・setter/getterの嫌なところ
・なぜ必要なのか
・何故存在しているのか
の順で説明しようと思います。

Setter/Getterとは何なのか

セッター/ゲッターってなんですかー?

.....

セットするやつ

ゲットするやつ

これくらいの理解度で大丈夫ですw

例:昨日、今日、明日の日付をセット/ゲットして出力する



Date date = new Date();

private Date yesterdayDate; //昨日の日付
private Date currentDate;   //今日の日付
private Date tomorrowDate;  //明日の日付

//setter:今日の日付
public void setCurrentDate(Date currentDay) {
    this.currentDay = currentDay;
}

//getter:今日の日付
public Date getCurrentDate() {
    return currentDay;
}

//以下省略...
//setter:昨日の日付
//getter:昨日の日付
//setter:明日の日付
//getter:明日の日付

public static void main(String[] args) throws Exception {
        //今日を設定
        calendar.setTime(date);
        setCurrentDate(calendar.getTime());

        //昨日を設定
        calendar.add(Calendar.DAY_OF_MONTH, -1);
        setYesterdayDate(calendar.getTime());

        //明日を設定
        calendar.add(Calendar.DAY_OF_MONTH, 1);
        setTomorrowDate(calendar.getTime());
        
        //昨日を表示
        System.out.println("昨日の日付:" + getYesterdayDate());
        //今日を表示
        System.out.println("今日の日付:" + getCurrentDate());
        //明日を表示
        System.out.println("明日の日付:" + getTomorrowDate());
}

こんな感じ。

setXXXXX, getXXXXXですね。

サンプルではクラス内で変数を設定して呼び出しているのでメソッドもprivateで問題ないですが、

privateで変数を設定 して、
setter,getterはpublic で作成します。

setter/getterの嫌なところ

1.それだけでコードが増える
setter:3行
getter:3行

はいこれだけで6行です。なるべくならごちゃごちゃ書きたくないのに6行...

2.管理が面倒
1と同じ理由ですが、コードが長くなればそれだけ管理が面倒になります。
セット、ゲットだけですがメソッドが2つ追加されます。それだけなのに。

3.そもそもの動きは内部で行っている

setCurrentDate(calendar.getTime());

このメソッド自体が今日の日付をセットしている訳ではありません。
メソッドの中の

this.currentDay = currentDay;

これがやってます。

getterなら

return currentDay;

で、日付をreturnしてくれるために取得できます。


つまり、今日の日付自体は

=で変数を渡す
returnで変数を返す

で設定している訳です。では。。

#なぜ必要なのか

=で変数を渡す
returnで変数を返す

でやっているんなら、setter/getterは不要なはず。
日付は全て

//set
this.currentDay = currentDay;
//get
currentDay;

これでいいはず。。ではなぜ必要なのか。

1.変数を守るため

privateで変数を作成し、セット/ゲットするのはpublicです。
なので、それ以外でセット/ゲットすることはできないです。

・上記=でのセットを禁止にして、setterのみでセット
・直接取得するのを禁止にして、getterのみでゲット
することで変数の値をセット/ゲットするのを制限します。

2.どこでセット/ゲットしているのかを明確にするため

1と同じ理由です。
setter/getterを使用することでセット/ゲットしている場所が明確になります。
また、getしている場所で落ちた場合は、それ以前でセットしていないのが明確になります。

とはいえ、setter/getter不要論は定期的に盛り上がったり盛り上がらなかったりしますw

では。。

#何故存在しているのか

setXXX
getXXX

内部の構造を見なくても、
これだけで何をしているのかがわかるからです。

setCurrentDate   //今日の日付をセット
getYesterdayDate  //昨日の日付をゲット
setOneMonthAgo  //1ヶ月前の日付をセット
getOneYearDate    //1年後の日付をゲット

こんな感じ。

#まとめ

ここまでずらずれ書きましたが、
慣例で存在している部分も一部ある と個人的に思ってます。

とにかく、コードが増えるのがすごく嫌。。

がしかし!
kotlinなんかはsetter/getterを内包しています。

val currentDate :Date; //今日の日付

はい。これで終わりw

varの内部構造としてsetter/getterを持っている、と言っておきましょうか。。
ちなみに、valの時はgetterのみ作られます。

最近はsetter/getterをわざわざ書かなくて良くなってるんですね。
ありがたや〜ありがたや!

参考

16
13
6

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
16
13

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?