Javaでメソッドチェーンを実現したい。
どうすれば達成できますか?
また、いつ使用するか教えてください。
public class Dialog {
public Dialog() {
}
public void setTitle(String title) {
//Logic to set title in dialog
}
public void setMessage(String message) {
//Logic to set message
}
public void setPositiveButton() {
//Logic to send button
}
}
次のように使用できるメソッドチェーンを作成します。
new Dialog().setTitle("Title1").setMessage("sample message").setPositiveButton();
またはのような
new Dialog().setTitle("Title1").setMessage("sample message");
またはのような
new Dialog().setTitle("Title1").setPositiveButton();
メソッドがthis
を返すようにします:
_public Dialog setMessage(String message)
{
//logic to set message
return this;
}
_
この方法では、メソッドの1つを呼び出すたびに、同じオブジェクトが返されるので、別のメソッドを呼び出すことができます。
この手法は、オブジェクトで一連のメソッドを呼び出す場合に役立ちます。それを実現するために必要なコードの量を減らし、メソッドのチェーンの後に単一の戻り値を持たせることができます。
ダイアログを表示するために必要なコードの量を減らす例は次のとおりです。
_// Your Dialog has a method show()
// You could show a dialog like this:
new Dialog().setMessage("some message").setTitle("some title")).show();
_
単一の戻り値を使用する例は次のとおりです。
_// In another class, you have a method showDialog(Dialog)
// Thus you can do:
showDialog(new Dialog().setMessage("some message").setTitle("some title"));
_
デニスが質問のコメントで言及したBuilderパターンの使用例:
_new DialogBuilder().setMessage("some message").setTitle("some title").build().show();
_
ビルダーパターンを使用すると、オブジェクトをビルドする前にクラスの新しいインスタンスのすべてのパラメーターを設定できます(ビルド後の値の設定が設定よりもコストがかかるfinal
フィールドまたはオブジェクトがあるクラスを検討してください)それが構築されたとき)。
上記の例では:setMessage(String)
、setTitle(String)
はDialogBuilder
クラスに属し、DialogBuilder
の同じインスタンスを呼び出します; build()
メソッドはDialogBuilder
クラスに属しますが、Dialog
オブジェクトを返しますshow()
メソッドはDialog
クラスに属します。
追加
これはあなたの質問とは関係ないかもしれませんが、あなたやこの質問に出くわした人たちを助けるかもしれません。
これはほとんどのユースケースでうまく機能します:継承を伴わないすべてのユースケースと、派生クラスが一緒に連鎖させたい新しいメソッドを追加しない場合の継承を伴ういくつかの特定のケースandメソッドのチェーンの結果を派生オブジェクトとして(キャストなしで)使用することに興味はありません。
基本クラスにメソッドを持たない派生クラスのオブジェクトのメソッドチェーンが必要な場合、またはメソッドのチェーンが派生クラスの参照としてオブジェクトを返すようにする場合は、答えを見ることができます この質問 。
静的ビルダーメソッドを追加し、セッターメソッドの別のセットを作成するだけです。例えば
class Model {
private Object FieldA;
private Object FieldB;
public static Model create() {
return new Model();
}
public Model withFieldA(Object value) {
setFieldA(value);
return this;
}
public Model withFieldB(Object value) {
setFieldB(value);
return this;
}
}
...
そして、それを次のように使用します
Model m = Model.create().withFieldA("AAAA").withFieldB(1234);
ダイアログを表示するために必要なコードの量を減らす例は次のとおりです。
package com.rsa.arraytesting;
public class ExampleJavaArray {
String age;
String name;
public ExampleJavaArray getAge() {
this.age = "25";
return this;
}
public ExampleJavaArray setName(String name) {
this.name = name;
return this;
}
public void displayValue() {
System.out.println("Name:" + name + "\n\n" + "Age:" + age);
}
}
別のクラス
package com.rsa.arraytesting;
public class MethodChaining {
public static void main(String[] args) {
ExampleJavaArray mExampleJavaArray = new ExampleJavaArray();
mExampleJavaArray.setName("chandru").getAge().displayValue();
}
}