Skip to content

Commit dbb8c84

Browse files
committed
feat: add Java 25 features including simplified main method and flexible constructor bodies
1 parent 8a4af05 commit dbb8c84

3 files changed

Lines changed: 213 additions & 1 deletion

File tree

docs/cours/java/2-quelques-classes-utiles.md

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,3 +44,94 @@ Lire ce que l’utilisateur saisit, c’est le rôle de la classe `Scanner` (du
4444
```
4545

4646
Grâce à ces classes, vous disposez déjà d’un arsenal pour interagir avec le monde extérieur. Prêt à écrire vos premiers programmes dynamiques ?
47+
## Nouveauté Java 25 : la classe `IO`
48+
49+
::: tip Java 25
50+
Depuis Java 25, une nouvelle classe `java.lang.IO` simplifie considérablement les entrées/sorties console. Comme elle fait partie du package `java.lang`, elle est disponible sans aucun import dans tous vos programmes.
51+
:::
52+
53+
La classe `IO` propose cinq méthodes statiques pour les opérations de base :
54+
55+
```java
56+
// Afficher du texte (équivalent de System.out.println)
57+
IO.println("Hello, World!");
58+
IO.print("Texte sans retour à la ligne");
59+
IO.println(); // Ligne vide
60+
61+
// Lire une saisie utilisateur (équivalent de Scanner)
62+
String nom = IO.readln("Entrez votre nom : ");
63+
String ligne = IO.readln(); // Sans message d'invite
64+
```
65+
66+
### Comparaison avec l'approche classique
67+
68+
```java
69+
// Avant Java 25 : affichage + lecture
70+
import java.util.Scanner;
71+
72+
public class Demo {
73+
public static void main(String[] args) {
74+
System.out.println("Hello, World!");
75+
Scanner scanner = new Scanner(System.in);
76+
System.out.print("Entrez votre nom : ");
77+
String nom = scanner.next();
78+
System.out.println("Bonjour " + nom);
79+
scanner.close();
80+
}
81+
}
82+
83+
// Depuis Java 25 : même programme, simplifié
84+
void main() {
85+
IO.println("Hello, World!");
86+
String nom = IO.readln("Entrez votre nom : ");
87+
IO.println("Bonjour " + nom);
88+
}
89+
```
90+
91+
::: info
92+
La classe `IO` ne remplace pas `System.out` ni `Scanner` : ces classes restent disponibles et nécessaires pour des cas plus complexes (lecture de nombres, flux de fichiers, etc.). `IO` est conçue pour simplifier les cas d'usage les plus courants, notamment pour les débutants.
93+
:::
94+
95+
## Nouveauté Java 25 : les imports de modules (`import module`)
96+
97+
::: tip Java 25
98+
Depuis Java 25, il est possible d'importer d'un coup toutes les classes publiques exportées par un module, grâce à la syntaxe `import module`.
99+
:::
100+
101+
Plutôt que d'écrire de multiples imports, on peut écrire une seule ligne :
102+
103+
```java
104+
// Avant Java 25 : imports classiques
105+
import java.util.List;
106+
import java.util.Map;
107+
import java.util.stream.Collectors;
108+
import java.util.stream.Stream;
109+
110+
// Depuis Java 25 : un seul import de module
111+
import module java.base;
112+
```
113+
114+
L'instruction `import module java.base;` rend disponibles toutes les classes de `java.util`, `java.io`, `java.math`, `java.time`, `java.util.stream`, etc. — soit les 54 packages exportés par le module `java.base`.
115+
116+
::: info
117+
Dans un fichier source compact (sans déclaration de classe), `import module java.base;` est automatiquement présent. Vous n'avez même pas besoin de l'écrire !
118+
:::
119+
120+
```java
121+
// Exemple avec import module
122+
import module java.base;
123+
124+
class Demo {
125+
void main() {
126+
var noms = List.of("Alice", "Bob", "Charlie");
127+
var majuscules = noms.stream()
128+
.map(String::toUpperCase)
129+
.collect(Collectors.toList());
130+
IO.println(majuscules);
131+
}
132+
}
133+
```
134+
135+
::: warning Attention
136+
Si deux modules exportent des classes avec le même nom (ex : `java.util.List` et `java.awt.List`), il faudra résoudre l'ambiguïté avec un import spécifique classique.
137+
:::

docs/cours/java/3-methode-main.md

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,3 +43,69 @@ Argument 2 : test
4343
```
4444

4545
Ainsi, la méthode `main` est la porte d’entrée universelle de vos aventures Java. C’est ici que tout commence !
46+
## Nouveauté Java 25 : simplification de la méthode `main`
47+
48+
::: tip Java 25
49+
Depuis Java 25, la signature de la méthode `main` a été considérablement simplifiée. Cette évolution vise à rendre le langage plus accessible aux débutants, en supprimant les éléments « cérémoniels » inutiles pour les petits programmes.
50+
:::
51+
52+
### Instance `main` methods
53+
54+
Les mots-clés `public`, `static` et le paramètre `String[] args` ne sont plus obligatoires. Java 25 permet d'écrire une méthode `main` d'instance, sans paramètre :
55+
56+
```java
57+
// Avant Java 25 (toujours valide)
58+
public class HelloWorld {
59+
public static void main(String[] args) {
60+
System.out.println("Hello, World!");
61+
}
62+
}
63+
64+
// Depuis Java 25 : signature simplifiée
65+
class HelloWorld {
66+
void main() {
67+
System.out.println("Hello, World!");
68+
}
69+
}
70+
```
71+
72+
Le lanceur Java choisit la méthode `main` selon cette priorité :
73+
1. S'il existe une méthode `main(String[] args)` (statique ou non), elle est choisie.
74+
2. Sinon, s'il existe une méthode `main()` sans paramètre, elle est choisie.
75+
3. Si la méthode choisie n'est pas `static`, Java instancie la classe (qui doit avoir un constructeur sans argument) puis appelle `main()` sur l'objet créé.
76+
77+
::: info
78+
La version classique `public static void main(String[] args)` reste parfaitement valide. La nouvelle syntaxe est simplement une alternative plus concise, idéale pour les petits programmes et l'apprentissage.
79+
:::
80+
81+
### Compact Source Files (fichiers sources compacts)
82+
83+
Java 25 va encore plus loin : il est possible d'écrire un programme sans même déclarer de classe ! On écrit directement les méthodes et champs dans le fichier source. Le compilateur crée automatiquement une classe implicite.
84+
85+
```java
86+
// Fichier HelloWorld.java — pas de déclaration de classe !
87+
void main() {
88+
System.out.println("Hello, World!");
89+
}
90+
```
91+
92+
On peut même y déclarer des méthodes auxiliaires et des champs :
93+
94+
```java
95+
// Fichier Greeting.java
96+
String greeting() { return "Hello, World!"; }
97+
98+
void main() {
99+
System.out.println(greeting());
100+
}
101+
```
102+
103+
::: warning Attention
104+
Un fichier source compact doit obligatoirement contenir une méthode `main` exécutable. La classe implicite créée par le compilateur n'a pas de nom utilisable dans le code source (on ne peut pas l'instancier avec `new`).
105+
:::
106+
107+
::: info Imports automatiques
108+
Dans un fichier source compact, toutes les classes publiques du module `java.base` sont automatiquement importées (comme si `import module java.base;` était présent en haut du fichier). Cela inclut `java.util.List`, `java.io.File`, `java.util.stream.Stream`, etc.
109+
:::
110+
111+
Cette approche progressive (compact → classe explicite → projet structuré) permet aux débutants de se concentrer sur la logique avant de découvrir les concepts d'encapsulation et de modularité.

docs/cours/java/8-classes.md

Lines changed: 56 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ Si vous ne définissez pas de constructeur, Java en crée un par défaut (sans a
6464

6565
Parfois, on souhaite proposer plusieurs façons de créer un objet, avec plus ou moins d’informations. Pour éviter de répéter du code, on peut faire appel à la délégation de constructeurs : un constructeur peut en appeler un autre de la même classe, en passant des valeurs par défaut.
6666

67-
**Attention : lappel à un autre constructeur (`this(...)`) doit toujours être la première instruction du constructeur.**
67+
**Attention (avant Java 25) : l'appel à un autre constructeur (`this(...)`) doit toujours être la première instruction du constructeur.** _(Voir la section [Nouveauté Java 25](#nouveauté-java-25--corps-de-constructeurs-flexibles-flexible-constructor-bodies) pour l'évolution de cette règle.)_
6868

6969
Exemple :
7070

@@ -93,7 +93,62 @@ public class Personne{
9393
::: tip Pourquoi déléguer ?
9494
Cela permet d’éviter la duplication de code et de centraliser la logique d’initialisation.
9595
:::
96+
### Nouveauté Java 25 : corps de constructeurs flexibles (Flexible Constructor Bodies)
9697

98+
Avant Java 25, l'appel à `this(...)` ou `super(...)` **devait obligatoirement** être la première instruction d'un constructeur. Cela empêchait toute validation ou transformation des arguments avant la délégation.
99+
100+
**Problème avant Java 25 :**
101+
102+
```java
103+
public class Personne {
104+
private String nom;
105+
106+
public Personne(String nom) {
107+
// ❌ Impossible de valider `nom` avant d'appeler this(...) ou super(...)
108+
// if (nom == null) throw new IllegalArgumentException("Le nom ne peut pas être null");
109+
this.nom = nom;
110+
}
111+
}
112+
```
113+
114+
Avec Java 25 (JEP 513), on peut désormais écrire du code **avant** l'appel à `this(...)` ou `super(...)`, dans ce qu'on appelle le **prologue** du constructeur :
115+
116+
```java
117+
public class Personne {
118+
private String nom;
119+
private String prenom;
120+
121+
public Personne(String nom) {
122+
// ✅ Java 25 : on peut valider et transformer AVANT la délégation
123+
if (nom == null) {
124+
throw new IllegalArgumentException("Le nom ne peut pas être null");
125+
}
126+
String nomMajuscule = nom.toUpperCase();
127+
this(nomMajuscule, "Inconnu"); // délégation après le prologue
128+
}
129+
130+
public Personne(String nom, String prenom) {
131+
this.nom = nom;
132+
this.prenom = prenom;
133+
}
134+
}
135+
```
136+
137+
::: warning Restrictions dans le prologue
138+
Dans le prologue (avant `this(...)` ou `super(...)`), vous **ne pouvez pas** :
139+
- accéder à `this` (ni lire ni écrire les champs de l'instance en cours de construction)
140+
- appeler des méthodes d'instance
141+
142+
Vous pouvez uniquement travailler avec les paramètres du constructeur et des variables locales.
143+
:::
144+
145+
::: tip Comparaison
146+
| | Avant Java 25 | Java 25+ |
147+
|---|---|---|
148+
| Code avant `this(...)` / `super(...)` | ❌ Interdit | ✅ Autorisé (prologue) |
149+
| Validation des arguments | Après la délégation uniquement | Avant la délégation |
150+
| Accès à `this` dans le prologue || ❌ Interdit |
151+
:::
97152
## Redéfinition (surcharge) de constructeur
98153

99154
Il est possible de définir plusieurs constructeurs dans une même classe, à condition qu’ils aient des signatures différentes (nombre ou type des arguments). C’est ce qu’on appelle la **surcharge**.

0 commit comments

Comments
 (0)