Ответ ниже говорит о том, что ближе всего вы можете получить к вложенным функциям в Java до Java 8. Это не обязательно способ, с помощью которого я бы выполнял те же задачи, которые могут быть обработаны с помощью вложенных функций в Javascript. Часто частный вспомогательный метод будет работать так же хорошо - возможно, даже частный вспомогательный тип , для которого вы создаете экземпляр внутри метода, но который доступен для всех методов.
Конечно, в Java 8 есть лямбда-выражения, которые являются гораздо более простым решением.
Самое близкое, к чему вы можете легко прийти - это анонимный внутренний класс. Это настолько близко, насколько Java подходит к замыканиям на данный момент, хотя, надеюсь, будет больше поддержки в Java 8.
Анонимные внутренние классы имеют различные ограничения - они, очевидно, довольно многословны по сравнению с вашим примером Javascript (или чем-либо, использующим лямбды), и их доступ к окружающему окружению ограничен конечными переменными.
Так (ужасно) извращать ваш пример:
interface Foo {
void bar(int x);
}
public class Test {
public static void main(String[] args) {
// Hack to give us a mutable variable we can
// change from the closure.
final int[] mutableWrapper = { 0 };
Foo times = new Foo() {
@Override public void bar(int num) {
mutableWrapper[0] *= num;
System.out.println(mutableWrapper[0]);
}
};
for (int i = 1; i < 100; i++) {
mutableWrapper[0] = i;
times.bar(2);
i = mutableWrapper[0];
times.bar(i);
i = mutableWrapper[0];
}
}
}
Выход:
2
4
10
100
Это вывод, который вы получаете из Javascript?