Stavo leggendo un Java 7 preview presentation (pdf) e c'era una diapositiva su Invocazione concatenata. Ecco l'esempio utilizzato nella diapositiva:Invocazione concatenata in 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();
E ho sentimenti contrastanti su questo. Non si dovrebbero concatenare troppe chiamate di metodo in un'unica istruzione. D'altra parte, scrivere margarita.this()
e margarita.that()
non è neanche troppo conveniente.
Ora, vengo a Java dal mondo di Delfi. E in Delphi c'è il costrutto del linguaggio with
. Questo è caro a pochi e odiato da molti (o è il contrario?). Trovo che with
sia più elegante dell'idea di invocazione concatenata (che credo funzioni sulla base del metodo void
che restituisce il riferimento all'oggetto su cui è stato richiamato - e questa è la parte che non mi piace, come void
dovrebbe restituire niente).
Gradirei la funzione with
lingua che viene adottato da Java, in modo che il codice di esempio potrebbe essere scritto in questo modo:
Drink margarita = null;
with (new DrinkBuilder()) {
add("tequila");
add("orange liqueur");
add("lime juice");
withRocks();
withSalt();
margarita = drink();
}
sono io l'unico che preferirebbe questa soluzione per l'invocazione incatenato? Qualcun altro ritiene che with
potrebbe essere un'estensione utile per il linguaggio Java? (Mi ricorda la domanda di qualcuno sulla necessità di "Java ++" ...)
Questo non è limitato a Java 7, è possibile scrivere un builder semplicemente restituendo "questo" nei metodi. Un buon esempio è java.lang.StringBuilder. –
Penso che il punto sia che Java 7 consente il concatenamento senza restituirlo, modificando quindi la semantica di una chiamata di metodo. – OregonGhost