IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

JDK 20 : la prochaine version de Java embarque six fonctionnalités phares parmi lesquelles Scoped Values
Une API qui permet de partager des données immuables au sein d'un même thread

Le , par Stéphane le calme

208PARTAGES

4  0 
Java 20, ou Java Development Kit (JDK) 20, la prochaine version prévue de Java standard, a atteint le stade de la Release Candidate, après avoir achevé les phases Rampdown. Au total, ce sont six fonctionnalités qui sont prévues pour cette itération, notamment Scoped Values, Record Patterns, Pattern Matching for switch, Foreign Function & Memory API, Virtual Threads, Structured Concurrency. Pour l'instant, elles sont soit au stade d'incubation, soit au stade d'aperçu.

Java 20 est passé à la phase de release candidate le 9 février, selon un bulletin de Mark Reinhold d'Oracle, architecte en chef du Java Platform Group. Une deuxième version candidate est prévue pour le 23 février. La disponibilité générale du JDK est prévue pour le 21 mars 2023, dans le cadre de la cadence de publication de six mois d'Oracle pour les éditions Java standard. Pour JDK 20, les développeurs sont encouragés à signaler les bogues via la base dédiée. La période qui s’ouvre doit permettre aux contributeurs de tester, identifier et corriger de nouvelles failles, dans le cadre d’un processus strict et ce avant publication de la version de production.


Les principales fonctionnalités attendues dans JDK 20 :

Scoped values

Cette API en phase d'incubation permet de partager des données immuables au sein d'un même thread ou entre plusieurs threads. Ces valeurs sont préférables aux variables locales aux threads, en particulier quand on utilise un grand nombre de threads virtuels. Scope Value permet de partager des données de manière sûre et efficace entre les composants d'un grand programme sans recourir aux arguments de méthode.

Les objectifs :
  • Facilité d'utilisation : fournissez un modèle de programmation pour partager des données à la fois au sein d'un thread et avec des threads enfants, afin de simplifier le raisonnement sur le flux de données.
  • Compréhensibilité : rendre visible la durée de vie des données partagées à partir de la structure syntaxique du code.
  • Robustesse : assurez-vous que les données partagées par un appelant ne peuvent être récupérées que par des appelés légitimes.
  • Performances : traitez les données partagées comme immuables afin de permettre le partage par un grand nombre de threads et d'activer les optimisations d'exécution.

Non-objectifs :
  • Ce n'est pas un objectif de changer le langage de programmation Java.
  • L'objectif n'est pas d'exiger une migration à partir des variables locales de thread ou de déprécier l'API ThreadLocal existante.


Pour en expliquer la motivation, l'équipe rapporte que les grands programmes Java sont généralement constitués de composants distincts et complémentaires qui doivent partager des données entre eux. Par exemple, une infrastructure Web peut inclure un composant serveur, implémenté dans le style thread par demande, et un composant d'accès aux données, qui gère la persistance. Dans tout le framework, l'authentification et l'autorisation des utilisateurs reposent sur un objet Principal partagé entre les composants. Le composant serveur crée un principal pour chaque thread qui gère une demande, et le composant d'accès aux données fait référence au principal d'un thread pour contrôler l'accès à la base de données.

Normalement, les données sont partagées entre l'appelant et l'appelé en les transmettant comme arguments de méthode, mais cela n'est pas viable pour un principal partagé entre le composant serveur et le composant d'accès aux données car le composant serveur appelle d'abord le code utilisateur non approuvé. Nous avons besoin d'un meilleur moyen de partager les données du composant serveur vers le composant d'accès aux données plutôt que de les connecter à une cascade d'invocations de méthodes non fiables.

Record Patterns

Disponibles en seconde preview, les Record Patterns améliorent le langage de programmation Java avec des motifs pour déconstruire les valeurs d'enregistrement Record Values. Les motifs d'enregistrement (record patterns) et les motifs de type (type patterns) peuvent être imbriqués pour permettre une forme déclarative, puissante et composable de navigation et de traitement des données.

Pour être plus précis, les Record Patterns ont été proposés en tant que fonction en preview par JEP 405 et livrés dans JDK 19. Ce JEP propose une deuxième preview avec d'autres améliorations basées sur l'expérience et les commentaires continus.

Les principaux changements depuis la première preview sont les suivants*:
  • Ajout de la prise en charge de l'inférence des arguments de type des modèles d'enregistrement génériques,
  • Ajout de la prise en charge des modèles d'enregistrement pour qu'ils apparaissent dans l'en-tête d'une instruction for améliorée, et
  • Suppression de la prise en charge des modèles d'enregistrement nommés.

Les objectifs sont d'étendre le filtrage de motifs pour exprimer des requêtes de données plus sophistiquées et composables, sans modifier la syntaxe ou la sémantique des motifs de type. Parmi les principales modifications apportées depuis le premier aperçu livré avec le JDK 19, on peut citer le support de l’inférence du type paramétré pour les patterns de record generic, le support des record patterns dans les boucles for (enhanced for statements) et la suppression du support des patterns de record nommés.

Pour en expliquer les motivations, l'équipe explique que dans JDK 16, JEP 394 a étendu l'opérateur instanceof pour prendre un modèle de type et effectuer une correspondance de modèle. Cette extension modeste permet de simplifier l'idiome familier instanceof-and-cast*:

Code Java : Sélectionner tout
1
2
3
4
5
6
7
8
9
10
// Old code 
if (obj instanceof String) { 
    String s = (String)obj; 
    ... use s ... 
} 
  
// New code 
if (obj instanceof String s) { 
    ... use s ... 
}
...
La fin de cet article est réservée aux abonnés. Soutenez le Club Developpez.com en prenant un abonnement pour que nous puissions continuer à vous proposer des publications.

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de foxzoolm
Membre habitué https://www.developpez.com
Le 25/03/2023 à 11:25

List<Point> points=....
for ( Point(int x, int y): points ){
...
}
la question est : le sucre syntaxique fit-il grossir ?

perso je trouve se genre d'annotation extrêmement dangereuse...
le principe de la POO (selon moi) etant de garder les methodes et les datas le plus proche possible (syntaxiquement)...

voir des x, y se balander dans le code sans lien avec l'objet... SIC!!!
4  0 
Avatar de thelvin
Modérateur https://www.developpez.com
Le 25/03/2023 à 17:27
Citation Envoyé par professeur shadoko Voir le message
Si mes souvenirs sont bons parmi les principes avancés à l'intérieur de l'équipe initiale Java il y avait: méfions nous des "facilités d'écriture"! au risque d'être bavards pas d'implicites, pas de raccourcis! ça fait déjà un bout de temps que ces principes sont partis à la poubelle.
Oui ben ça nous a filé les lambdas et le instanceof pattern.
Le moins que l'on puisse dire est que mettre ces principes à la poubelle a été, jusqu'à maintenant, très bénéfique.
4  0 
Avatar de Padget
Membre régulier https://www.developpez.com
Le 22/03/2023 à 22:18
Je trouve que sur ce genre d'annonces d'Oracle il manque toujours des exemples de code pour illustrer les propos. Parce que j'ai personnellement rien compris au blabla sur la preversion 2 des records...
3  0 
Avatar de miaous
Membre averti https://www.developpez.com
Le 23/03/2023 à 10:24
Citation Envoyé par Padget Voir le message
Je trouve que sur ce genre d'articles il manque toujours des exemples de code pour illustrer les propos. Parce que j'ai personnellement rien compris au blabla sur la preversion 2 des records...
avec JEP 432 : Record Patterns (deuxième préversion) pour un record Point (int x, int y)
tu pourras ecrire
Code : Sélectionner tout
1
2
3
4
5
6
List<Point> points=....
for ( Point(int x, int y): points ){
System.out.println(" " +x ", " +y );

}
équivalent à:

Code : Sélectionner tout
1
2
3
4
5
6
7
8
List<Point> points=....
for ( Point p: points ){
int x=p.x();
int y=p.y();
System.out.println(" " +x ", " +y );

}
0  0 
Avatar de professeur shadoko
Membre chevronné https://www.developpez.com
Le 25/03/2023 à 9:04
Citation Envoyé par miaous Voir le message
avec JEP 432 : Record Patterns (deuxième préversion) pour un record Point (int x, int y)
tu pourras ecrire
Code : Sélectionner tout
1
2
3
4
5
6
List<Point> points=....
for ( Point(int x, int y): points ){
System.out.println(" " +x ", " +y );

}
équivalent à:

Code : Sélectionner tout
1
2
3
4
5
6
7
8
List<Point> points=....
for ( Point p: points ){
int x=p.x();
int y=p.y();
System.out.println(" " +x ", " +y );

}
Si mes souvenirs sont bons parmi les principes avancés à l'intérieur de l'équipe initiale Java il y avait: méfions nous des "facilités d'écriture"! au risque d'être bavards pas d'implicites, pas de raccourcis! ça fait déjà un bout de temps que ces principes sont partis à la poubelle.
0  0 
Avatar de professeur shadoko
Membre chevronné https://www.developpez.com
Le 26/03/2023 à 17:15
Citation Envoyé par thelvin Voir le message
Oui ben ça nous a filé les lambdas et le instanceof pattern.
Le moins que l'on puisse dire est que mettre ces principes à la poubelle a été, jusqu'à maintenant, très bénéfique.
pas de pb pour le instanceof mais pour le cas de lambda mes sentiments sont très partagés: c'est pratique mais une source d'effets de bord pas très explicites. Je rêve d'une forme syntaxique dans laquelle ce qui est modifiable dans le contexte soit bien spécifié (au risque d'être horriblement bavard).
0  0 
Avatar de bouye
Rédacteur/Modérateur https://www.developpez.com
Le 27/03/2023 à 5:37
C'est une question d'habitude a prendre, on a le même soucis avec les accesseurs des champs des record qui laissent tomber le prefix get (is pour les boolean) et se contentent de reprendre le nom de la variable a l'identique.
0  0 
Avatar de floyer
Membre éclairé https://www.developpez.com
Le 27/03/2023 à 16:16
Les lambda peuvent être très utile dans une approche fonctionnelle. On a une collection, et on déduit une autre collection avec map ou filter. Une approche «*purement fonctionnelle*» évite justement des effets de bord. Évidemment la fonction lambda peut avoir un effet de bord en interagissant avec les objets qui lui sont proposés, mais pas plus qu’un bloc équivalent dans une boucle for.
0  0