JEP 463, Implicitly Declared Classes and Instance Main Methods (Second Preview)

Contexte

Comme la précdente JEP, l’objectif 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.

Nouveauté

Cette monture prend en compte des retours de la JEP 445: Unnamed Classes and Instance Main Methods (Preview)

Elle amène deux simplications:

  • La classe est maintennant implicitement nommée par le nom du fichier défini au niveau du système d’exploitation

  • Le déroulement pour rechercher la bonne méthode est simplifié. C’est à dire que la JVM recherche une méthode main avec un argument String[] , puis sans résultat, elle recherche une méthode main sans argument.

avertissementIl est à noter que de toute façon, on ne peut pas avoir la même méthode avec ou sans le mot clé static. Donc il y aura de confusion suite à cette simplification.

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 l’ensemble du fichier correspond à une classe sans nom qui sera créé implicement avec le nom du ficheir (d’où le nom : Implicitly Declared 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

Comme je l’évoqué dans le précédent billet, 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

Comme indiqué dans le paragraphe sur les nouveautés.

La recherche du point d’entrée est :

  • rechercher une méthode main avec l’argument String[]

  • rechercher une méthode main avec sans argument

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).

avertissementIl est à noter que si la méthode est une méthode d’instance (sans static). Il sera nécessaire d’avoir un construction sans argument non privé.

Détails sur la classe explicitement nommé

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());
}