Je veux réaliser le chaînage de méthodes en Java.
Comment puis-je y parvenir?
Faites-moi également savoir 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éthodes que je peux utiliser comme suit:
new Dialog().setTitle("Title1").setMessage("sample message").setPositiveButton();
ou comme
new Dialog().setTitle("Title1").setMessage("sample message");
ou comme
new Dialog().setTitle("Title1").setPositiveButton();
Demandez à vos méthodes de renvoyer this
comme:
public Dialog setMessage(String message)
{
//logic to set message
return this;
}
De cette façon, après chaque appel à l'une des méthodes, vous obtiendrez le même objet retourné afin que vous puissiez appeler une autre méthode.
Cette technique est utile lorsque vous souhaitez appeler une série de méthodes sur un objet: elle réduit la quantité de code requise pour y parvenir et vous permet d'avoir une seule valeur renvoyée après la chaîne de méthodes.
Un exemple de réduction de la quantité de code nécessaire pour afficher une boîte de dialogue serait:
// 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 retournée unique 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 Builder mentionné par Dennis dans le commentaire de votre question:
new DialogBuilder().setMessage("some message").setTitle("some title").build().show();
Le modèle de générateur vous permet de définir tous les paramètres pour une nouvelle instance d'une classe avant la construction de l'objet (considérez les classes qui ont des champs final
ou des objets pour lesquels la définition d'une valeur après sa construction est plus coûteuse que la définition quand il est construit).
Dans l'exemple ci-dessus: setMessage(String)
, setTitle(String)
appartiennent à la classe DialogBuilder
et retournent la même instance de DialogBuilder
à laquelle ils sont appelés; la méthode build()
appartient à la classe DialogBuilder
, mais renvoie un objet Dialog
la méthode show()
appartient à la classe Dialog
.
Extra
Cela pourrait ne pas être 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 d'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 souhaitez enchaîner et vous n'êtes pas intéressé à utiliser (sans transtypage) le résultat de la chaîne de méthodes comme objet du dérivé.
Si vous voulez avoir un chaînage de méthode pour les objets des classes dérivées qui n'ont pas de méthode dans leur classe de base ou si vous voulez que la chaîne de méthodes renvoie l'objet comme référence de la classe dérivée, vous pouvez jeter un œil aux réponses pour cette question .
Ajoutez simplement une méthode de générateur statique et créez un autre ensemble de méthodes de définition. 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 utilisez-le comme
Model m = Model.create().withFieldA("AAAA").withFieldB(1234);
un exemple de réduction de la quantité de code nécessaire pour afficher une boîte de dialogue serait:
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();
}
}