В последнее время я много читал о следующем выпуске Java, возможно, с поддержкой замыканий. Мне кажется, что я достаточно твердо понимаю, что такое замыкания, но я не могу придумать убедительного примера того, как они могли бы сделать объектно-ориентированный язык «лучше».
Ну, большинство людей, которые используют термин «замыкание», на самом деле имеют в виду «функциональный объект», и в этом смысле функциональные объекты позволяют писать более простой код в определенных обстоятельствах, например, когда вам нужны пользовательские компараторы в функции сортировки.
Например, в Python:
def reversecmp(x, y):
return y - x
a = [4, 2, 5, 9, 11]
a.sort(cmp=reversecmp)
Это сортирует список a в обратном порядке, передавая пользовательское сравнение functoin reversecmp. Добавление лямбда-оператора делает вещи еще более компактными:
a = [4, 2, 5, 9, 11]
a.sort(cmp=lambda x, y : y - x)
В Java нет функциональных объектов, поэтому для их моделирования используются "классы функторов". В Java вы выполняете эквивалентную операцию, реализуя пользовательскую версию класса Comparator и передавая ее в функцию сортировки:
class ReverseComparator implements Comparator {
public compare(Object x, Object y) {
return (Integer) y - (Integer) x;
}
...
List<Integer> a = Arrays.asList(4, 2, 5, 9, 11);
Collections.sort(a, new ReverseComparator());
Как видите, он дает тот же эффект, что и замыкания, но более неуклюж и более многословен. Тем не менее, добавление анонимных внутренних классов устраняет большую часть боли:
List<Integer> a = Arrays.asList(4, 2, 5, 9, 11);
Comparator reverse = new Comparator() {
public Compare(Object x, Object y) {
return (Integer) y - (Integer) x;
}
}
Collections.sort(a, reverse);
Так что я бы сказал, что сочетание классов функторов + анонимных внутренних классов в Java достаточно, чтобы компенсировать отсутствие истинных функциональных объектов, делая их добавление ненужным.