58 votes

Fonctions imbriquées en Java

Existe-t-il des extensions pour le langage de programmation Java qui permettent de créer des fonctions imbriquées ?

Il existe de nombreuses situations où je dois créer des méthodes qui ne sont utilisées qu'une seule fois dans le contexte d'une autre méthode ou d'une boucle for. Jusqu'à présent, je n'ai pas réussi à le faire en Java, même si cela peut être fait facilement en JavaScript.

Par exemple, cela ne peut pas être fait en Java standard :

for(int i = 1; i < 100; i++){
    times(2); // Multiply i by 2 and print i
    times(i); // Square i and then print the result

    public void times(int num){

        i *= num;
        System.out.println(i);
    }
}

0voto

Woody Zenfell III Points 921

Pensez à créer une classe locale anonyme et à utiliser son bloc d'initialisation pour faire le travail :

public class LocalFunctionExample {
    public static void main(final String[] args) {
        for (final int i[] = new int[] { 1 }; i[0] < 100; i[0]++) {
            new Object() {
                {
                    times(2); //multiply i by 2 and print i
                    times(i[0]); //square i and then print the result
                }

                public void times(final int num) {
                    i[0] *= num;
                    System.out.println(i[0]);
                }
            };
        }
    }
}

Sortie :

2
4
10
100

(L'astuce du "wrapper final" n'est pas automatiquement requise avec cette technique, mais elle était nécessaire ici pour gérer l'exigence de mutation).

Cette méthode est presque aussi concise que la version lambda, mais vous pouvez utiliser toutes les signatures de méthodes que vous voulez, elles ont de vrais noms de paramètres et les méthodes sont appelées directement par leur nom - il n'est pas nécessaire d'utiliser la fonction .apply() ou autre. (Ce genre de choses permet parfois de faire fonctionner un peu mieux l'outillage IDE).

-7voto

michael Points 7

Je déteste utiliser le mot interdit mais vous pourriez utiliser un goto pour créer une sous-routine efficace à l'intérieur de la méthode. C'est laid et dangereux mais beaucoup plus facile que ce qui a été montré dans les réponses précédentes. Bien que la méthode privée avec un appel à l'intérieur de la première méthode soit bien meilleure et réponde parfaitement à vos besoins. Je ne sais pas pourquoi vous voudriez utiliser une méthode imbriquée pour quelque chose d'aussi simple que cela.

2 votes

Sory about the typos this keyboard isn't working poperly, some buttons are sticking and i cant capitalize.

4 votes

-1 : La question est sur Java, qui n'a pas goto aussi.

1 votes

Bien joué de recommander un mot-clé qui n'existe pas en Java.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X