2014-01-17 3 views
32

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

Как шаблон Builder? –

+2

Обычно это называется программированием «бегло» или «свободно». – Pureferret

+0

Вы должны создать Builder для Dialog вместо использования seters для свободного Api. Если вы сделаете так много доступа к bean-файлу, больше не будете работать, поскольку рамки ограничивают seters возвратом void. Посмотрите на проект ломбок, если вы не любите писать всю эту плиту котла. –

ответ

65

Пусть ваши методы возвращают 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(); 

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

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

Extra

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

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

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

+0

Я добавил, что пример использует последний, поскольку я пропустил часть вашего вопроса. Имейте в виду, что это не единственное использование для цепочки методов и/или шаблон Builder: как и при большинстве шаблонов кодирования, алгоритмах и методах, с небольшим количеством творчества можно найти новое использование для старого шаблона (алгоритм, техника) :) –

+0

Неправильная практика изменения поведения настроек, поскольку некоторые фреймворки не ожидают возврата из метода setter. Как, например, вы получите сообщение об ошибке с драйвером Java Cassandra, если сеттеры в вашей модели вернут некоторые значения. – Vagif

0

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

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

} 

} 
+0

упаковка com.rsa.arraytesting; общественного класса MethodChaining { \t государственной статической силы основных (String []) {арг \t \t ExampleJavaArray mExampleJavaArray = новый ExampleJavaArray(); \t \t mExampleJavaArray.setName ("chandru"). GetAge(). DisplayValue(); \t } –

1

Просто добавьте статический метод строитель, и создать еще один набор методов инкубационные , Например

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); 
Смежные вопросы