как добиться цепочки методов в java?

Я хочу достичь цепочки методов в 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();

3 ответов


пусть ваши методы вернутся this как:

public Dialog setMessage(String message)
{
    //logic to set message
    return this;
}

таким образом, после каждого вызова одного из методов вы получите один и тот же объект, чтобы вы могли вызвать другой метод.

этот метод полезен, когда вы хотите вызвать серию методов на объекте: он уменьшает количество кода, необходимого для достижения этого, и позволяет иметь одно возвращаемое значение после цепочки методов.

пример уменьшения количества кода требуется, чтобы показать диалог будет:

// 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();

шаблон builder позволяет задать все параметры для нового экземпляра класса перед построением объекта (рассмотрим классы, которые имеют final поля или объекты, для которых значение после его создания более дорогостоящий, чем установка его, когда он построен).

в приведенном выше примере:setMessage(String), setTitle(String) принадлежат DialogBuilder class и возвращает тот же экземпляр DialogBuilder что они призваны;build() метод принадлежит DialogBuilder класс, но возвращает Dialog объект show() метод принадлежит Dialog класса.

Extra

это может быть не связано с вашим вопросом, но это может помочь вам и другим, что наткнулся на этот вопрос.

это хорошо работает для большинства случаев использования: все случаи использования, которые не связаны с наследованием, и некоторые частные случаи, связанные с наследованием, когда производный класс не добавляет новые методы, которые вы хотите связать вместе и вас не интересует использование (без приведения) результата цепочки методов в качестве объекта производного.

если вы хотите иметь цепочку методов для объектов производных классов, которые не имейте метод в своем базовом классе или вы хотите, чтобы цепочка методов возвращала объект в качестве ссылки на производный класс, вы можете посмотреть ответы для этот вопрос.


просто добавьте статический метод builder и создайте другой набор методов setter. Например

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();

}

}