valores sentencia retornar retornan que metodos crear java method-chaining

sentencia - return metodos en java



¿Cómo hacer el encadenamiento de métodos en Java? o.m1(). m2(). m3(). m4() (6)

He visto en muchas notación de código Java que después de un método llamamos a otro, aquí hay un ejemplo.

Toast.makeText(text).setGravity(Gravity.TOP, 0, 0).setView(layout).show();

Como ves después de llamar a makeText en el retorno, llamamos setGravity y hasta ahora

¿Cómo puedo hacer esto con mis propias clases? ¿Tengo que hacer algo especial?


Agregar devuelve esto; seguramente ayudaría en encadenar para esta clase pero no para las subclases.

Si desea que el comportamiento de encadenamiento también se herede a las subclases, cambie la firma de su clase de la siguiente manera:

Clase SuperClass <SubClass extends SuperClass> {}

De esta forma, todas las subclases heredarán el encadenamiento de métodos.

Ejemplo:

public class SuperClass<SubClass extends SuperClass> { public SubClass testMethod(){ return (SubClass)this; } public static void main(String[] args) { SuperClass<SuperClass> superClass = new SuperClass<SuperClass>(); superClass.testMethod().testMethod().testMethod(); System.out.println(superClass.toString()); } }


Busque un patrón de generador o una interfaz fluida en google para obtener más detalles al respecto.

Devolver ''esto'' al final de su método puede hacer el truco en la mayoría de los casos.


De tu ejemplo:

Toast.makeText (text) .setGravity (Gravity.TOP, 0, 0) .setView (layout) .show ();

Cada método de la cadena debe devolver una clase o una interfaz. El siguiente método en la cadena debe ser parte de la clase devuelta.

Comenzamos con Toast. El método makeText, que se define como un método estático en la clase Toast, debe devolver una clase o una interfaz. Aquí, devuelve una instancia de la clase Gravedad.

El método setGravity, que se define en la clase Gravity, devuelve una instancia de la clase View,

El método setView, que se define en la vista de clase, devuelve una instancia de la clase JPanel.

Esta cadena podría escribirse paso a paso.

Gravity gravity = Toast.makeText(text); View view = gravity.setGravity(Gravity.TOP, 0, 0); JPanel panel = view.setView(layout); panel.show();

Escribir la cadena como una cadena elimina todas las variables de instancia intermedias del código fuente.


Este patrón se denomina "Interfaces fluidas" (ver en.wikipedia.org/wiki/Fluent_interface )

Solo return this; de los métodos en lugar de devolver nada.

Así por ejemplo

public void makeText(String text) { this.text = text; }

se convertiría

public Toast makeText(String text) { this.text = text; return this; }


o puede usar Diezel que genera todas las interfaces que necesita basándose en una expresión regular de su API fluida.


class PersonMethodChaining { private String name; private int age; // In addition to having the side-effect of setting the attributes in question, // the setters return "this" (the current Person object) to allow for further chained method calls. public PersonMethodChaining setName(String name) { this.name = name; return this; } public PersonMethodChaining setAge(int age) { this.age = age; return this; } public void introduce() { System.out.println("Hello, my name is " + name + " and I am " + age + " years old."); } // Usage: public static void main(String[] args) { PersonMethodChaining person = new PersonMethodChaining(); // Output: Hello, my name is Peter and I am 21 years old. person.setName("Peter").setAge(21).introduce(); }

}

Sin método de encadenamiento

class Person { private String name; private int age; // Per normal Java style, the setters return void. public void setName(String name) { this.name = name; } public void setAge(int age) { this.age = age; } public void introduce() { System.out.println("Hello, my name is " + name + " and I am " + age + " years old."); } // Usage: public static void main(String[] args) { Person person = new Person(); // Not using chaining; longer than the chained version above. // Output: Hello, my name is Peter and I am 21 years old. person.setName("Peter"); person.setAge(21); person.introduce(); } }

El método de encadenamiento, también conocido como parámetro con nombre idiom , es una sintaxis común para invocar múltiples llamadas a métodos en lenguajes de programación orientados a objetos. Cada método devuelve un objeto, permitiendo que las llamadas se encadenen juntas en una sola declaración. El encadenamiento es azúcar sintáctico que elimina la necesidad de variables intermedias. Una cadena de métodos también se conoce como un accidente de tren debido al aumento en el número de métodos que vienen uno tras otro en la misma línea que ocurre a medida que más métodos se encadenan juntos aunque los saltos de línea a menudo se agregan entre los métodos.

Una sintaxis similar es el método en cascada , donde después del llamado al método, la expresión evalúa el objeto actual, no el valor de retorno del método. La conexión en cascada se puede implementar utilizando el método de encadenamiento haciendo que el método devuelva el objeto actual (esto). La conexión en cascada es una técnica clave en interfaces fluidas, y como el encadenamiento se implementa ampliamente en lenguajes orientados a objetos, mientras que la cascada no lo es, esta forma de "encadenamiento por encadenamiento al devolver esto" a menudo se denomina simplemente "encadenamiento". Tanto el encadenamiento como la cascada provienen del lenguaje Smalltalk.