メソッドを使ってメンバ変数を変更する理由

広告

前のページで、メンバ変数に直接値を格納する代わりに、いったんクラスの中で定義しているメソッドを呼び出してメンバ変数に値を格納する方法も記述しました。では何故このようなことをするかと言いますと、例えばメンバ変数に格納できる値の事前チェックをしたり、メンバ変数と他のメンバ変数が連動している場合などの処理を行うことが出来るからです。

例えばテレビのチャンネルは「1」か「3」しか実際には存在しないとします。その場合にメンバ変数に直接値を格納すると、下記のように実際には存在しない値でも格納することが出来てしまいます。

class ctest{
  public static void main(String args[]){
    Television tv1 = new Television();

    tv1.channelNo = 5;
  }
}

class Television{
  int channelNo;

  void dispChannel(){
    System.out.println("現在のチャンネルは " + channelNo + " です");
  }
}

これを防止する代わりにいったんメソッドを呼び出し、その中で格納できる値かどうかを事前にチェックすることが出来ます。

class ctest{
  public static void main(String args[]){
    Television tv1 = new Television();

    tv1.setChanne(5);
  }
}

class Television{
  int channelNo;

  void setChannel(int newChannelNo){
    if ((newChannelNo == 1) || (newChannel == 3)){
      channelNo = newChannelNo;
    }
  }

  void dispChannel(){
    System.out.println("現在のチャンネルは " + channelNo + " です");
  }
}

大規模なシステムになってくると、各クラスを別々の人が作成するということもあります。その場合、メンバ変数に直接値を記述できるような形にしていると、クラスを設計した人が予期しない値を直接格納する危険性もあります。その為、いったんメソッドを呼び出し、その中でメンバ変数に値を格納するということはよく行います。

また別の例として、メンバ変数を変更した時に他のメンバ変数も連動して変更しておきたい場合を考えてみます。

class ctest{
  public static void main(String args[]){
    Television tv1 = new Television();

    tv1.setChanne(5);
  }
}

class Television{
  int channelNo;
  String housouKyoku;

  void setChannel(int newChannelNo){
    if (newChannelNo == 1){
      channelNo = 1;
      housouKyoku = "FujiTV";
    } else if (newChannelNo == 3){
      channelNo = 3;
      housouKyoku = "NHK";
    }
  }

  void setHousoukyoku(String newHousouKyoku){
    if (newHousouKyoku.equals("FujiTV")){
      channelNo = 1;
      tvKyoku = "FujiTV";
    } else if (newHousouKyoku.equals("NHK")){
      channelNo = 3;
      tvKyoku = "NHK";
    }
  }

  void dispChannel(){
    System.out.println("現在のチャンネルは " + channelNo + " です");
  }
}

上記の例ですと、チャンネル番号を変更すると、自動的に他のメンバ変数で放送局を表す「housouKyoku」の値も変更されています。また逆に放送局の値を変更するとチャンネル番号も変更されます。このようにメンバ変数の値を変更することで他のメンバ変数の値も同期して変更したい場合などにメソッドを呼び出す形にしていることで可能になります。

もちろん「tv1.channelNo = 1;」とした後で「tv1.housouKyoku = "FujiTV";」という命令を同時に行っておけば同様のことが行えますが、複雑に連動している場合にはいちいち記述するのも面倒ですし、記述するのを忘れてしまったり、間違えて記述してしまったりといった不具合を未然に防ぐ事も出来ます。

どんな場合でもこのようにした方がいいわけでは無いので、目的に応じて直接メンバ変数に値を格納できるようにしたり、メソッド経由で行うようにしたりといった判断を行って下さい。

( Written by Tatsuo Ikura )

関連記事 (一部広告含む)