Estaba leyendo Java 7 preview presentation (pdf) y había una diapositiva en Invocación encadenada. Aquí está el ejemplo utilizado en la diapositiva:Invocación encadenada en Java 7?
// Construction with setters
DrinkBuilder margarita = new DrinkBuilder();
margarita.add("tequila");
margarita.add("orange liqueur");
margarita.add("lime juice");
margarita.withRocks();
margarita.withSalt();
Drink drink = margarita.drink();
// Construction with chained invocation
Drink margarita = new DrinkBuilder()
.add("tequila")
.add("orange liqueur")
.add("lime juice")
.withRocks()
.withSalt()
.drink();
Y tengo sentimientos encontrados sobre esto. Uno no debe encadenar muchas invocaciones de métodos en una sola declaración. Por otro lado, escribir margarita.this()
y margarita.that()
tampoco es muy conveniente.
Ahora, vengo a Java del mundo Delphi. Y en Delphi está el constructo de lenguaje with
. Esto es apreciado por unos pocos y aborrecido por muchos (¿o es al revés?). Encuentro que with
es más elegante que la idea de invocación encadenada (que creo que funciona sobre la base del método void
que devuelve referencia al objeto sobre el que se ha invocado, y esta es la parte que no me gusta, como debería regresar void
nada).
apreciaría la característica with
idioma siendo adoptado por Java, por lo que el código de ejemplo se puede escribir así:
Drink margarita = null;
with (new DrinkBuilder()) {
add("tequila");
add("orange liqueur");
add("lime juice");
withRocks();
withSalt();
margarita = drink();
}
¿Soy el único que prefieren esta solución a la invocación encadenado? ¿Alguien más siente que with
podría ser una extensión útil para el lenguaje Java? (Me recuerda a la pregunta de alguien sobre la necesidad de "Java ++" ...)
Esto no se limita a Java 7, puede escribir un constructor simplemente devolviendo "this" en los métodos. Un buen ejemplo es java.lang.StringBuilder. –
Creo que el punto es que Java 7 permite el encadenamiento sin devolver esto, por lo tanto, cambiar la semántica de una llamada a un método. – OregonGhost