L'équipe de développement du JDK devrait inclure des collections séquencées et des modèles de chaînes de caractères avec Java 21. Parmi les autres caractéristiques possibles du JDK 21 figurent toutes les fonctions d'incubation et de prévisualisation du JDK 20, telles que les scoped values, les records patterns et les virtual threads. Les génériques universels et l'API VM asynchrone de suivi de pile pourraient également être inclus.Même un développeur Java de longue date peut ne pas avoir une bonne compréhension de la manière dont la plateforme est développée et maintenue. La principale leçon à retenir est qu'il s'agit vraiment d'un processus ouvert.
À la base du développement de Java, se trouve le Java Community Process (JCP). Il s'agit d'une sorte de document de base auto-conscient qui définit la manière d'introduire des modifications dans la plateforme et qui permet ainsi de modifier le processus lui-même. La dernière version du JCP est la 2.11, qui a été adoptée en 2019.
Le JCP formalise la manière dont les nouvelles fonctionnalités et les modifications apportées à Java (c'est-à-dire les spécifications techniques) sont proposées, examinées et approuvées, y compris la définition de divers rôles que les gens peuvent occuper. Ces rôles permettent d'offrir un lieu où la communauté des utilisateurs de Java peut participer à la gouvernance de la plateforme.
Lorsqu'un effort est suffisamment large, il est considéré comme un projet JDK. Ce terme recouvre un large éventail d'artefacts, de la documentation au code, incluant souvent une ou plusieurs propositions d'amélioration du JDK (JEP). Les projets impliquent un ou plusieurs groupes de travail. Les groupes sont dédiés à divers domaines de la plateforme Java. Un projet compte généralement plusieurs personnes actives dans le rôle d'auteur.
Pour proposer de nouvelles fonctionnalités et des changements, le JCP permet la création ("initiation") de Java Specification Requests (JSR). Cela se fait via un formulaire standardisé. Pour accéder au formulaire, vous devez vous inscrire pour obtenir un compte JCP gratuit.
De nouvelles versions de l'implémentation Java standard d'Oracle sont disponibles tous les six mois. Comme dit précédemment, parmi les autres caractéristiques possibles du JDK 21 figurent toutes les fonctions d'incubation et de prévisualisation du JDK 20, telles que les scoped values, les records patterns et les virtual threads. Les génériques universels et l'API VM asynchrone de suivi de pile pourraient également être inclus.
Bien que la page de publication du JDK 21 ne mentionne encore aucune fonctionnalité au 9 mars 2023, deux propositions d'amélioration de Java couvrant ces deux fonctionnalités ont déjà été désignées pour le JDK 21. Les propositions spécifiques sont les suivantes
Collections séquencées
Introduire de nouvelles interfaces pour représenter les collections avec un ordre de rencontre défini. Chacune de ces collections possède un premier élément bien défini, un deuxième élément, et ainsi de suite jusqu'au dernier élément. Elle fournit aussi des API uniformes pour accéder à ses premiers et derniers éléments, et pour traiter ses éléments dans l'ordre inverse.
Motivation
Le framework des collections de Java manque d'un type de collection qui représente une séquence d'éléments avec un ordre de rencontre défini. Il manque par ailleurs un ensemble uniforme d'opérations qui s'appliquent à ces collections. Ces lacunes ont été une source répétée de problèmes et de plaintes.
Par exemple, List et Deque définissent tous deux un ordre de rencontre, mais leur supertype commun est Collection, qui ne le définit pas. De même, Set ne définit pas d'ordre de rencontre et les sous-types tels que HashSet n'en définissent pas, alors que les sous-types SortedSet et LinkedHashSet en définissent un. La prise en charge de l'ordre de rencontre est donc dispersée dans la hiérarchie des types, ce qui rend difficile l'expression de certains concepts utiles dans les API.
Ni Collection ni List ne peuvent décrire un paramètre ou une valeur de retour ayant un ordre de rencontre. Collection est trop général, reléguant de telles contraintes à la spécification de la prose, ce qui peut conduire à des erreurs difficiles à déboguer. List est trop spécifique, excluant SortedSet et LinkedHashSet.
Un problème connexe est que les collections de vues sont souvent obligées d'adopter une sémantique plus faible. En enveloppant un LinkedHashSet avec Collections::unmodifiableSet, on obtient un Set, sans tenir compte de l'information sur l'ordre de rencontre.
Sans interfaces pour les définir, les opérations liées à l'ordre de rencontre sont soit incohérentes, soit absentes. Bien que de nombreuses implémentations permettent d'obtenir le premier ou le dernier élément, chaque collection définit sa propre méthode, et certaines ne sont pas évidentes ou sont totalement absentes.
Certaines d'entre elles sont inutilement lourdes, comme l'obtention du dernier élément d'une liste. D'autres ne sont même pas possibles sans faire preuve d'héroïsme : Le seul moyen d'obtenir le dernier élément d'un LinkedHashSet est d'itérer l'ensemble.
De même, l'itération des éléments d'une collection du premier au dernier est simple et cohérente, mais l'itération dans l'ordre inverse ne l'est pas non plus. Toutes ces collections peuvent être itérées vers l'avant à l'aide d'un Iterator, de la boucle for améliorée, de stream() ou de toArray(). L'itération en sens inverse est différente dans chaque cas. NavigableSet fournit la vue descendingSet() pour l'itération inverse :
| Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 12 | for (var e : navSet.descendingSet())
process(e);
Deque does so with a reverse Iterator:
for (var it = deque.descendingIterator(); it.hasNext();) {
var e = it.next();
process(e);
}
List does so but with ListIterator:
for (var it = list.listIterator(list.size()); it.hasPrevious();) {
var e = it.previous();
process(e);
} |
De même, le traitement des éléments d'une collection à l'aide de flux est une alternative puissante et efficace au traitement des éléments à l'aide de boucles, mais il peut être difficile d'obtenir un flux dans l'ordre inverse. Parmi les différentes collections qui définissent l'ordre de rencontre, la seule qui prenne en charge cette fonctionnalité est NavigableSet :
navSet.descendingSet().stream()
Les autres collections nécessitent soit de copier les éléments dans une autre collection, soit de créer un flux à partir d'un Spliterator personnalisé qui inverse l'itération.
Cette situation est regrettable. Le concept de collection avec un ordre de rencontre défini existe à plusieurs endroits dans le cadre des collections, mais il n'y a pas de type unique qui le représente. En conséquence, certaines opérations sur de telles collections sont incohérentes ou manquantes, et le traitement d'éléments dans l'ordre inverse va de l'inconfortable à l'impossible. Nous devons combler ces lacunes.
Description
L'équipe définit de nouvelles interfaces pour les collections séquencées, les ensembles séquencés et les cartes séquencées, puis nous les intégrons dans la hiérarchie des types de collections existants. Toutes les nouvelles méthodes déclarées dans ces interfaces sont implémentées par défaut.
Une collection séquencée est une collection dont les éléments ont un ordre de rencontre défini. (Le mot "séquencé" tel qu'il est utilisé ici est le participe passé du verbe séquencer, qui signifie « arranger les éléments dans un ordre particulier »). Une collection séquencée a un premier et un dernier élément, et les éléments entre eux ont des successeurs et des prédécesseurs. Une collection séquencée permet d'effectuer des opérations communes à chaque extrémité et de traiter les éléments du premier au dernier et du dernier au premier (c'est-à-dire en avant et en arrière).
| Code : | Sélectionner tout |
1 2 3 4 5 6 7 8 9 10 11 | interface SequencedCollection<E> extends Collection<E> {
// new method
SequencedCollection<E> reversed();
// methods promoted from Deque
void addFirst(E);
void addLast(E);
E getFirst();
E getLast();
E removeFirst();
E removeLast();
} |
La nouvelle méthode reversed() permet d'obtenir une vue inversée de la collection d'origine. Toute modification apportée à la collection d'origine est visible dans la vue. Si cela est autorisé, les modifications apportées à la vue s'inscrivent dans la collection d'origine.
La vue inversée permet à tous les différents types séquencés de traiter les éléments dans les deux sens, en utilisant tous les mécanismes d'itération habituels : Enhanced for loops, explicit iterator() loops, forEach(), stream(), parallelStream(), and toArray().
Par exemple, il était auparavant assez difficile d'obtenir un flux ordonné à l'envers à partir d'un LinkedHashSet.
| Code : | Sélectionner tout |
linkedHashSet.reversed().stream()
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.


