Подтвердить что ты не робот

Как добиться сцепления метода в 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();
4b9b3361

Ответ 1

Попросите методы вернуть 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();

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

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

Extra

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

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

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

Ответ 2

Просто добавьте метод статического построителя и создайте еще один набор методов 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);

Ответ 3

Пример уменьшения количества кода, необходимого для отображения диалогового окна, будет:

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

}

}