La réponse ci-dessous parle de ce qui se rapproche le plus des fonctions imbriquées en Java avant Java 8. Ce n'est pas nécessairement la façon dont je traiterais les mêmes tâches qui pourraient être traitées avec des fonctions imbriquées en JavaScript. Souvent, une méthode d'aide privée fera tout aussi bien l'affaire - peut-être même une méthode d'aide privée type dont vous créez une instance dans la méthode, mais qui est disponible pour toutes les méthodes.
Dans Java 8, bien sûr, il existe des expressions lambda qui constituent une solution beaucoup plus simple.
Ce qui s'en rapproche le plus, c'est une classe interne anonyme. Pour l'instant, Java ne s'approche pas plus des fermetures que cela, même si nous espérons qu'il y aura plus de support dans Java 8.
Les classes internes anonymes ont diverses limitations - elles sont évidemment plutôt verbeuses par rapport à votre exemple JavaScript (ou tout ce qui utilise des lambdas) et leur accès à l'environnement environnant est limité aux variables finales.
Donc pour (horriblement) pervertir votre exemple :
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];
}
}
}
Sortie :
2
4
10
100
Est-ce le résultat que vous obtenez avec le code JavaScript ?