comment réaliser un chaînage de méthodes en java?

je veux réaliser le chaînage de méthode en Java.

comment l'atteindre?

dites-moi aussi quand l'utiliser.

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
     }
}   

je veux créer un chaînage de méthode que je peux utiliser comme suit:

new Dialog().setTitle("Title1").setMessage("sample message").setPositiveButton();

ou similaires

new Dialog().setTitle("Title1").setMessage("sample message");

ou similaires

new Dialog().setTitle("Title1").setPositiveButton();
40
demandé sur ROMANIA_engineer 2014-01-17 11:32:57

3 réponses

faites retourner vos méthodes this aimez:

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

de Cette façon, après chaque appel à une des méthodes, vous aurez le même objet renvoyé de sorte que vous pouvez appeler une autre méthode.

cette technique est utile quand vous voulez appeler une série de méthodes sur un objet: elle réduit la quantité de code nécessaire pour atteindre cela et vous permet d'avoir une seule valeur retournée après la chaîne de méthodes.

Un exemple de réduire la quantité de code nécessaire pour afficher une boîte de dialogue:

// Your Dialog has a method show() 
// You could show a dialog like this:
new Dialog().setMessage("some message").setTitle("some title")).show();

un exemple d'utilisation de la valeur unique retournée serait:

// In another class, you have a method showDialog(Dialog)
// Thus you can do:
showDialog(new Dialog().setMessage("some message").setTitle("some title"));

un exemple d'utilisation du modèle de constructeur que Dennis a mentionné dans le commentaire sur votre question:

new DialogBuilder().setMessage("some message").setTitle("some title").build().show();

le modèle builder vous permet de définir tous les paramètres pour une nouvelle instance d'une classe avant que l'objet ne soit construit (considérez les classes qui ont des champs ou des objets final pour lesquels fixer une valeur après qu'elle ait été construite est plus coûteux que de la définir quand elle est construite).

dans l'exemple ci-dessus: setMessage(String) , setTitle(String) appartiennent à la classe DialogBuilder et renvoient la même instance de DialogBuilder qu'ils sont appelés; la méthode build() appartient à la classe DialogBuilder , mais renvoie un objet Dialog la méthode show() appartient à la classe DialogBuilder . Dialog de la classe.

Extra

cela n'est peut-être pas lié à votre question, mais cela pourrait vous aider, vous et les autres qui rencontrent cette question.

cela fonctionne bien pour la plupart des cas d'utilisation: tous les cas d'utilisation qui n'impliquent pas l'héritage et certains cas particuliers impliquant l'héritage lorsque la classe dérivée n'ajoute pas de nouvelles méthodes que vous voulez enchaîner ensemble et vous n'êtes pas intéressés par l'utilisation (sans casting) le résultat de la chaîne de méthodes d'un objet de la dérivée.

si vous voulez avoir le chaînage de méthode pour les objets de classes dérivées qui n'ont pas de méthode dans leur classe de base ou vous voulez la chaîne de méthodes pour retourner l'objet comme référence de la classe dérivée, vous pouvez avoir un regard sur les réponses pour cette question .

79
répondu lucian.pantelimon 2017-05-23 12:34:54

il suffit d'ajouter une méthode de constructeur statique, et de créer un autre ensemble des méthodes de setter. Par exemple

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;
   }
}

...

et l'utiliser comme

 Model m = Model.create().withFieldA("AAAA").withFieldB(1234);
3
répondu Vagif 2016-06-21 22:48:58

exemple de réduire la quantité de code nécessaire pour afficher une boîte de dialogue:

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

une autre classe

package com.rsa.arraytesting;

public class MethodChaining {

public static void main(String[] args) {

    ExampleJavaArray mExampleJavaArray = new ExampleJavaArray();

    mExampleJavaArray.setName("chandru").getAge().displayValue();

}

}
0
répondu Chandru Sekar 2015-04-14 11:42:42