Récapitulatif - Conteneur générique
Fait partie de la section Programmation Orientée Objet du Journey Java de Coddy — leçon 58 sur 87.
Défi
FacileConstruisons un système de stockage polyvalent qui rassemble tout ce que vous avez appris sur les génériques ! Vous allez créer une classe Container capable de stocker, récupérer et traiter des éléments de n'importe quel type, ainsi que des méthodes utilitaires illustrant l'utilisation des jokers (wildcards).
Vous organiserez votre code sur trois fichiers :
Container.java: Créez une classe génériqueContainer<T>qui gère une collection d'éléments. Votre conteneur doit utiliser uneArrayList<T>en interne pour stocker les éléments. Incluez les méthodesadd(T item)pour ajouter un élément,get(int index)pour récupérer un élément à une position spécifique,size()pour retourner le nombre d'éléments, etisEmpty()pour vérifier si le conteneur est vide. Ajoutez également une méthodegetAll()qui retourne la liste interne.ContainerUtils.java: Créez une classe utilitaire avec des méthodes génériques statiques qui fonctionnent avec vos conteneurs :printAll(Container<?> container)- Utilise un joker non borné (unbounded wildcard) pour afficher tous les éléments de n'importe quel conteneur, un par ligne.countItems(Container<? extends Number> container)- Utilise un joker avec borne supérieure (upper bounded wildcard) pour calculer la somme de toutes les valeurs numériques du conteneur, en retournant le résultat sous forme dedouble.addDefaults(Container<? super Integer> container)- Utilise un joker avec borne inférieure (lower bounded wildcard) pour ajouter les entiers 1, 2 et 3 à n'importe quel conteneur pouvant accepter des entiers.<T> T getLastOrDefault(Container<T> container, T defaultValue)- Une méthode générique qui retourne le dernier élément du conteneur, ou la valeur par défaut si le conteneur est vide.Main.java: Rassemblez votre système de conteneur générique ! Vous recevrez trois entrées : un mot (String), un entier et un double.Tout d'abord, créez un
Container<String>et ajoutez-y le mot deux fois. AffichezString container:puis utilisezprintAllpour afficher son contenu.Ensuite, créez un
Container<Double>et ajoutez-y la valeur double. Affichez une ligne vide, puisNumber sum: [sum]en utilisantcountItems.Ensuite, créez un
Container<Number>et appelezaddDefaultssur celui-ci. Affichez une ligne vide, puisAfter adding defaults:et utilisezprintAllpour montrer le contenu.Enfin, créez un
Container<Integer>vide et utilisezgetLastOrDefaultavec votre entier en entrée comme valeur par défaut. Affichez une ligne vide, puisLast or default: [result].
Vous recevrez trois entrées dans l'ordre : un mot (String), un entier et un double.
Ce défi combine les classes génériques, les méthodes génériques, les paramètres de type bornés et les trois types de jokers. Remarquez comment chaque élément remplit un rôle différent : la classe générique fournit un stockage sécurisé au niveau des types, les jokers bornés permettent une lecture et une écriture flexibles, et les méthodes génériques offrent des opérations réutilisables sur différents types de conteneurs !
Essayez vous-même
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Lire les entrées
String word = scanner.nextLine();
int intValue = Integer.parseInt(scanner.nextLine());
double doubleValue = Double.parseDouble(scanner.nextLine());
// TODO: Créer un Container<String> et ajouter le mot deux fois
// Afficher "String container:" puis utiliser ContainerUtils.printAll()
// TODO: Créer un Container<Double> et ajouter la valeur double
// Afficher une ligne vide, puis "Number sum: [sum]" en utilisant ContainerUtils.countItems()
// TODO: Créer un Container<Number> et appeler ContainerUtils.addDefaults() dessus
// Afficher une ligne vide, puis "After adding defaults:" et utiliser ContainerUtils.printAll()
// TODO: Créer un Container<Integer> vide
// Utiliser ContainerUtils.getLastOrDefault() avec intValue comme valeur par défaut
// Afficher une ligne vide, puis "Last or default: [result]"
}
}
Toutes les leçons de Programmation Orientée Objet
1Fondamentaux de la POO
Fichiers externesIntroduction à la POOClasses vs ObjetsLe mot-clé thisMéthodesChamps (Attributs)Méthode constructeurSurcharge de constructeurRécapitulatif - Calculatrice simple4Héritage
Héritage de base (extends)Le mot-clé superRedéfinition de méthode (@Override)Chaînage de constructeursLa classe ObjectHéritage simple et multiniveauPourquoi pas d'héritage multiple de classesRécapitulatif - Hiérarchie des employés7Méthodes spéciales et classe Object
Méthode toString()equals() et hashCode()Méthode clone()compareTo() et ComparableInterface ComparatorRécapitulatif - Tri personnalisé2Modificateurs d'accès et Encapsulation
Aperçu des niveaux d'accèsMéthodes Getter et SetterMasquage d'informationsLe mot-clé finalRécapitulatif - Gestionnaire de compte bancaire5Polymorphisme
Bases de la surcharge de méthodesRedéfinition de méthodes (Run-Time)Upcasting et DowncastingL'opérateur instanceofClasses et méthodes abstraitesRécapitulatif - Calculateur de formes8Concepts avancés de la POO
Composition vs HéritageAgrégation vs CompositionClasses internes, imbriquées et anonymesEnums et méthodes d'EnumRecords (Java 16+)Classes scellées (Java 17+)11Patrons de conception, partie 1
Introduction aux patrons de conceptionPatron SingletonPatron FabriquePatron MonteurPatron ObservateurPatron Stratégie3Propriétés de classe et membres statiques
Variables d'instance vs variables statiquesMéthodes statiquesBlocs statiquesConstantes (static final)Récapitulatif - Compteur et utilitaire6Interfaces et Classes Abstraites
Introduction aux InterfacesImplémentation d'InterfacesImplémentation d'Interfaces MultiplesDefault et Static dans les InterfacesClasses Abstraites vs InterfacesInterfaces FonctionnellesRécapitulatif - Système de Paiement9La généricité
Introduction à la généricitéClasses génériquesMéthodes génériquesParamètres de type bornésWildcards (?, extends, super)Récapitulatif - Conteneur générique12Patrons de conception, partie 2
Patron CommandePatron AdaptateurPatron DécorateurPatron Template MethodPatron ÉtatPatron CompositePatron Itérateur