Вопрос:

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

java methods chaining

40887 просмотра

3 ответа

245 Репутация автора

Я хочу добиться цепочки методов в 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();
Автор: Bug Источник Размещён: 17.01.2014 07:32

Ответы (3)


92 плюса

3152 Репутация автора

Решение

Ваши методы возвращаются 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классу.

дополнительный

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

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

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

Автор: lucian.pantelimon Размещён: 17.01.2014 07:35

1 плюс

51 Репутация автора

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

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

}

}
Автор: Chandru Sekar Размещён: 14.04.2015 11:14

4 плюса

304 Репутация автора

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

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);
Автор: Vagif Размещён: 21.06.2016 10:48
Вопросы из категории :
32x32