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