Setter return value is void or this...?

 たまには技術的なことでも。
昨日仕事中に壁にぶち当たりました。

public MyClass setValue(Value value){
 this.value = value;
 return this;
}

ざっと言えばこんなコードに出会った‥。
よくあるSetterだ‥戻り値がそのクラスそれ自体じゃなければ。

俺は教科書的な書き方しか知らなくて、
だから、getterで取得、
setterは戻り値void、としか習ってないし、それ以外はないとすら思い込んでた。
この戻り値this、にするのは作法的にありなのか、そしてこれにするとなにがいいのか‥

日本語のサイトだとあまりいい解説が見つけられなくて(検索の仕方が悪かったかも)、
やむなく英語で探すと、StackOverFlow辺りにちらほらと‥。
全然まとまってなかったけど、曰くthisを返すタイプは
・setする項目が大量にあるときにcool
・あるデザインパターンの書き方
・Java7で認められた仕様(?)
・悪しきコードだからJava8では完全に消えるはず
なんてことが書いてあったな。
下2つは、ちょっと真偽を調べてもよくわからなかったけど。

で、前置きが長くなったけど、1つめに書かれてる
項目が大量にあるときにcoolっていうのがどういうことか、
備忘録として残しておくことにする。

まずはざっくりしたサンプルコード。

・MyClass
MyClass{
 private int no;
 private String name;
 private String phone;

 public MyClass setNo(int no){
  this.no = no;
  return this;
 }

 public MyClass setName(String name){
  this.name = name;
  return this;
 }

 public MyClass setPhone(String phone){
  this.phone = phone;
  return this;
 }

 //以下略
}

・テスター

class Test{
 public static void main(String args[]){
  MyClass class = new MyClass();

//thisだからできること
class.setNo(1).setName("hmk404").setPhone("000-0000");

//伝統的な書き方
class.setNo(1);
class.setName("hmk404");
class.setPhone("000-0000");
} }


MyClassはthisで戻り値を返すタイプとして一先ず書いたけど‥
テスターでの書き方の違いが伝わるかな。
setterを連続して使えるんだよね、thisで返ってると。

つまり、
setNoが終わった時点で
class.setNoはclassに変わる‥
そうするとclass.setNo.setNameだったわけだから
class.setNameに置き換わってそのままメソッドが実行できる、ってわけ。

比較のために伝統的な書き方の場合も示したけど、
いちいち"class"って記述をしなくて良いってのは楽かもね。
特に、今は3つしかsetする項目がなかったけど、もっと多い場合なんかには。
‥‥初見だと一体なにが起きているのか一瞬わからなくなるから、
可読性は多少落ちる気もするけど。

これが悪しきコードなのかどうかはわからないけど、
便利なのは確か!
こんなの常識なのかな‥解説してるサイトも全然ないし、テキスト類でも
今まで読んだものには載ってなかったんだけれど‥‥。

伝統的な書き方をするのか、この新しい(?)書き方をするのかは
最終的に好みの問題として落ち着きそうだから、
よりしっくり来る方を使って、いいものが作れると良いですね~

今日はこの辺で。
Bye.

Remove all ads