Javaで自作クラスのインスタンスのパラメータを設定する時に、連続でセッターを呼ぶ場面があって、DialogFragmentみたいに連続でセッターを呼ぶにはどうすればいいのかなと思って、調べたメモ。
#普通のセッター
Android Studioのセッターの自動生成を利用すると
Message.java
public class Message {
private String mTitle;
private String mContent;
private String mAddress;
public void setTitle(String title) {
mTitle = title;
}
public void setContent(String content) {
mContent = content;
}
public void setAddress(String address) {
mAddress = address;
}
}
これでセッターを呼ぶには
Message message = new Message();
message.setTitle("Hello");
message.setContent("How are you?");
message.setAddress("hoge@foobar.com");
.
.
.
何回もmessageを記述する必要があるので面倒。
目指す形はこんな感じ。
Message message = new Message();
message.setTitle("Hello")
.setContent("How are you?")
.setAddress("hoge@foobar.com")
.setSender("John")
.send();
#書き換えたセッター
どうやってるのかなと思って、いろんなライブラリのソースの見てみたら意外に簡単だった。
Message.java
public class Message {
private String mTitle;
private String mContent;
private String mAddress;
public Message setTitle(String title) {
mTitle = title;
return this;
}
public Message setContent(String content) {
mContent = content;
return this;
}
public Message setAddress(String address) {
mAddress = address;
return this;
}
}
よく考えれば当たり前だけど、戻り値を自分自身にすればできました。
#追記
@kidotaka さんのご指摘のようにBuilderパターンで実装する方法が定石のようでした。
Message.java
public class Message {
private String mTitle;
private String mContent;
private String mSender;
private String mAddress;
static class Builder {
private Message message;
public Builder() {
message = new Message();
}
public Builder setTitle(String title) {
message.setTitle(title);
return this;
}
public Builder setContent(String content) {
message.setContent(content);
return this;
}
public Builder setSender(String sender) {
message.setSender(sender);
return this;
}
public Builder setAddress(String address) {
message.setAddress(address);
return this;
}
public Message build() {
return message;
}
}
パラメータをセットする。
new Message.Builder()
.setTitle("Hello")
.setContent("How are you?")
.setAddress("hoge@foobar.com")
.setSender("John")
.build();