cómo lograr el método de encadenamiento en java?

Quiero lograr el encadenamiento de métodos en Java.

¿Cómo puedo lograrlo?

También avíseme cuándo usarlo.

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

Quiero crear un método de encadenamiento que pueda usar de la siguiente manera:

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

o como

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

o como

 new Dialog().setTitle("Title1").setPositiveButton(); 

Haga que sus métodos devuelvan this como:

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

De esta forma, después de cada llamada a uno de los métodos, obtendrá el mismo objeto devuelto para que pueda llamar a otro método.

Esta técnica es útil cuando desea llamar a una serie de métodos en un objeto: reduce la cantidad de código requerido para lograr eso y le permite tener un único valor devuelto después de la cadena de métodos.

Un ejemplo de reducción de la cantidad de código requerido para mostrar un diálogo sería:

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

Un ejemplo de uso del único valor devuelto sería:

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

Un ejemplo del uso del patrón de Constructor que Dennis mencionó en el comentario de su pregunta:

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

El patrón del constructor le permite establecer todos los parámetros para una nueva instancia de una clase antes de que se construya el objeto (considere las clases que tienen campos u objetos final para los cuales establecer un valor después de su construcción es más costoso que configurarlo cuando está construido) .

En el ejemplo anterior: setMessage(String) , setTitle(String) pertenece a la clase DialogBuilder y devuelve la misma instancia de DialogBuilder que se llama; el método build() pertenece a la clase DialogBuilder , pero devuelve un objeto Dialog que el método show() pertenece a la clase Dialog .

Extra

Esto podría no estar relacionado con su pregunta, pero podría ayudarlo a usted y a otros que se encuentren con esta pregunta.

Esto funciona bien para la mayoría de los casos de uso: todos los casos de uso que no involucran herencia y algunos casos particulares que implican herencia cuando la clase derivada no agrega nuevos métodos que desea encadenar entre sí y no está interesado en usar (sin conversión) ) el resultado de la cadena de métodos como un objeto del derivado.

Si desea tener un encadenamiento de métodos para objetos de clases derivadas que no tienen un método en su clase base o si desea que la cadena de métodos devuelva el objeto como referencia de la clase derivada, puede echar un vistazo a las respuestas para esta pregunta .

Simplemente agregue un método de generador estático y cree otro conjunto de métodos setter. Por ejemplo

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

Y úsalo como

  Model m = Model.create().withFieldA("AAAA").withFieldB(1234); 

Un ejemplo de cómo reducir la cantidad de código requerido para mostrar un diálogo sería:

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

otra clase

 package com.rsa.arraytesting; public class MethodChaining { public static void main(String[] args) { ExampleJavaArray mExampleJavaArray = new ExampleJavaArray(); mExampleJavaArray.setName("chandru").getAge().displayValue(); } } 
    Intereting Posts