JEP 445, Unnamed Classes and Instance Main Methods (Preview)

Contexte

L’objectif de cette JEP est de faciliter l’apprentissage du langage Java pour les étudiants, en enlevant certaines "cérémonies" du langage.

Cela permet à l’étudiant d’appréhender plus facilement le langage et d’ajouter les fonctionnalités et la complexité au fûr et à mesure de son apprentissage.

Pour rappel, un exemple de premier programme correspond au code suivant :

public class Bonjour {
    public static void main(String[] args) {
        System.out.println("Bonjour à tous !");
    }
}

Exemple de syntaxe qui peut dérouter l’étudiant

  • Déclaration d’une classe publique avec le mot réservé class

  • Utilisation de String[] pour les paramètres

  • Le modificateur static est généralement troublant au début.

Pour autant, il ne faut pas avoir

  • Un langage différent pour l’apprentissage

  • Un ensemble d’outils différents pour la construction ces programmes

Principe

Le premier principe est de ne pas obliger que la méthode main soit statique (static). C’est à dire qu’il est possible d’avoir une simple méthode d’instance. (d’où le nom : Instance Main Methods) De même, le terme public n’est plus nécessaire et le paramètre String[] devient optionnel.

Le second principe est de considérer une classe sans nom qui sera créé automatiquement (d’où le nom : Unnamed Classes).

Cela donne le code suivant comme résultat :

void main() {
    System.out.println("Bonjour à tous !");
}

Exécution

Nous pouvons passer par le compilateur, puis par la JVM. N’oubliez pas que c’est une fonctionnalité en aperçu, donc il faudra l’option --enable-preview

avertissementL’utilisation de l’option --enable-preview demandera de préciser le niveau de la source ou de la release.

Nous avons avec le schéma classique avec le compilateur

javac --release 21 --enable-preview Bonjour.java
java --enable-preview Bonjour

Depuis la JEP 330 (Launch Single-File Source-Code Programs), disponible depuis le JDK 11, nous pouvons passer par une et une seule commande:

java --source 21 --enable-preview Bonjour.java

Dans les deux cas, nous obtenons l’exécution suvante :

Note: Main.java uses preview features of Java SE 21.
Note: Recompile with -Xlint:preview for details.
Bonjour à tous!

Détails sur le lancement

Lors du lancement d’un programme, la méthode m̀ain exécutée est choisie parmi les méthodes suivantes en respectant cet ordre :

  • static void main(String[])

  • static void main()

  • void main(String [])

  • void main()

avertissementLa méthode doit être déclarée comme une méthode non privée (c’est à dire avec la visibilité publique, protégée ou package).

Détails sur la classe sans nom

Il est possible de définir des variables. Ils seront traduits par attributs de la classe.

String bonjour = "Bonjour à tous!";

void main() {
    System.out.println(bonjour);
}

De même, pour les fonctions.

String bonjour() { return "Bonjour à tous!"; }

void main() {
    System.out.println(bonjour());
}