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 argumentString[]
, puis sans résultat, elle recherche une méthodemain
sans argument.
Il 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
L’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’argumentString[]
-
rechercher une méthode
main
avec sans argument
La 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).
Il 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());
}
Moteur de recherche
"Eduquer, ce n'est pas remplir des vases mais c'est d'allumer des feux." - Michel Montaigne
Billets récents
- Eclipse plante systématiquement sous Debian (et autres distribution Linux)
- JEP 463, Implicitly Declared Classes and Instance Main Methods (Second Preview)
- Debian - Montée de version de Debian 11 (Bullseye) à Debian 12 (Bookworm)
- JEP 451, Prepare to Disallow the Dynamic Loading of Agents
- JEP 444, Virtual Threads