Siempre he encontrado que la declaración de cambio de java no es tan potente como lo necesito. En su last release lambdaj implements it con un uso inteligente de cierre y Hamcrest matcher. Por ejemplo, lambdaj Switcher permite implementar un patrón de estrategia. Supongamos que tiene que cambiar entre tres algoritmos de clasificación en función de alguna característica de la lista que se va a ordenar. En particular, vamos a suponer que hemos un algoritmo especializado para cuerdas:
public List<String> sortStrings(List<String> list) {
// a sort algorithm suitable for Strings
}
otro que funciona bien con pequeñas listas que tienen no más de 100 artículos:
public List<T> sortSmallList(List<T> list) {
// a sort algorithm suitable for no more than 100 items
}
y más general de propósito uno:
public List<String> sort(List<String> list) {
// a generic sort algorithm
}
Dados estos 3 métodos de clasificación, es posible crear una estrategia que elija la más adecuada de ellas de la siguiente manera declarativa:
Switcher<List<T>> sortStrategy = new Switcher<List<T>>()
.addCase(having(on(List.class).get(0), instanceOf(String.class))),
new Closure() {{ of(this).sortStrings(var(List.class)); }})
.addCase(having(on(List.class).size(), lessThan(100))),
new Closure() {{ of(this).sortSmallList(var(List.class)); }})
.setDefault(new Closure() {{ of(this).sort(var(List.class)); }});
y ordenar una lista con el mejor algoritmo disponible mediante la invocación del Switcher:
List<T> sortedList = sortStrategy.exec(list, list);
Cuando no desea peeve-off la próxima desarrollador que tiene que mantener sus códigos 100x si/otras declaraciones –
No lo sé ... Creo que estaré igual de molesto por 100 casos en un cambio. :-) Huele a mal diseño. – cjstehno
Siempre porque es más rápido: http://stackoverflow.com/questions/2086529 –