Я всегда обнаруживал, что оператор переключения Java не так силен, как мне нужно. В своем последнем выпуске lambdaj реализует его с умным использованием замыкания и совпадения Hamcrest.
Например, lambdaj Switcher позволяет реализовать шаблон стратегии. Предположим, вам нужно переключиться между тремя алгоритмами сортировки на основе некоторой характеристики списка, который нужно отсортировать. В частности, давайте предположим, что у нас есть специализированный алгоритм для строк:
public List<String> sortStrings(List<String> list) {
// a sort algorithm suitable for Strings
}
еще один, который хорошо работает с небольшими списками, содержащими не более 100 элементов:
public List<T> sortSmallList(List<T> list) {
// a sort algorithm suitable for no more than 100 items
}
и более универсальный:
public List<String> sort(List<String> list) {
// a generic sort algorithm
}
С учетом этих 3 методов сортировки можно создать стратегию, которая выбирает наиболее подходящий из них следующим декларативным способом:
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)); }});
и сортируйте список, используя лучший из доступных алгоритмов, вызывая Switcher:
List<T> sortedList = sortStrategy.exec(list, list);