Riepilogo - Contenitore generico
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 58 di 87.
Sfida
FacileCostruiamo un sistema di archiviazione versatile che riunisce tutto ciò che hai imparato sui generics! Creerai una classe Container in grado di archiviare, recuperare ed elaborare elementi di qualsiasi tipo, insieme a metodi di utilità che mostrano i wildcard in azione.
Organizzerai il codice in tre file:
Container.java: crea una classe genericaContainer<T>che gestisce una raccolta di elementi. Il tuo contenitore deve usare internamente unArrayList<T>per archiviare gli elementi. Includi i metodiadd(T item)per aggiungere un elemento,get(int index)per recuperare un elemento in una posizione specifica,size()per restituire il numero di elementi eisEmpty()per verificare se il contenitore non contiene elementi. Aggiungi anche un metodogetAll()che restituisca la lista interna.ContainerUtils.java: crea una classe di utilità con metodi generici statici che operano sui tuoi contenitori:printAll(Container<?> container)- Usa un wildcard non limitato per stampare tutti gli elementi di qualsiasi contenitore, uno per riga.countItems(Container<? extends Number> container)- Usa un wildcard con limite superiore per calcolare la somma di tutti i valori numerici nel contenitore, restituendo il risultato comedouble.addDefaults(Container<? super Integer> container)- Usa un wildcard con limite inferiore per aggiungere gli interi 1, 2 e 3 a qualsiasi contenitore in grado di contenere interi.<T> T getLastOrDefault(Container<T> container, T defaultValue)- Un metodo generico che restituisce l'ultimo elemento del contenitore oppure il valore predefinito se il contenitore è vuoto.Main.java: metti insieme il tuo sistema di contenitori generici! Riceverai tre input: una parola (String), un intero e un double.Per prima cosa, crea un
Container<String>e aggiungici la parola due volte. StampaString container:, poi usaprintAllper visualizzarne il contenuto.Poi, crea un
Container<Double>e aggiungici il valore double. Stampa una riga vuota, poiNumber sum: [sum]usandosumValues.Quindi, crea un
Container<Number>e chiamaciaddDefaults. Stampa una riga vuota, poiAfter adding defaults:e usaprintAllper mostrare il contenuto.Infine, crea un
Container<Integer>vuoto e usagetLastOrDefaultcon il tuo input intero come valore predefinito. Stampa una riga vuota, poiLast or default: [result].
Riceverai tre input nell'ordine seguente: una parola (String), un intero e un double.
Questa sfida combina classi generiche, metodi generici, parametri di tipo con limiti e tutti e tre i tipi di wildcard. Nota come ogni elemento abbia uno scopo diverso: la classe generica fornisce un'archiviazione sicura rispetto ai tipi, i wildcard con limiti consentono letture e scritture flessibili e i metodi generici offrono operazioni riutilizzabili con diversi tipi di contenitori!
Provalo tu
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leggi gli input
String word = scanner.nextLine();
int intValue = Integer.parseInt(scanner.nextLine());
double doubleValue = Double.parseDouble(scanner.nextLine());
// TODO: Crea un Container<String> e aggiungi la parola due volte
// Stampa "String container:", poi usa ContainerUtils.printAll()
// TODO: Crea un Container<Double> e aggiungi il valore double
// Stampa una riga vuota, poi "Number sum: [sum]" usando ContainerUtils.countItems()
// TODO: Crea un Container<Number> e chiama ContainerUtils.addDefaults() su di esso
// Stampa una riga vuota, poi "After adding defaults:" e usa ContainerUtils.printAll()
// TODO: Crea un Container<Integer> vuoto
// Usa ContainerUtils.getLastOrDefault() con intValue come valore predefinito
// Stampa una riga vuota, poi "Last or default: [result]"
}
}
Tutte le lezioni di Programmazione orientata agli oggetti
1Fondamenti della programmazione a oggetti
File esterniIntroduzione alla programmazione a oggettiClassi e oggettiLa parola chiave thisMetodiCampi (attributi)Metodo costruttoreSovraccarico dei costruttoriRipasso - Calcolatrice semplice4Ereditarietà
Ereditarietà di base (extends)La parola chiave superSovrascrittura dei metodi (@Override)Concatenamento dei costruttoriLa classe ObjectEreditarietà singola e multilivelloPerché non esiste l'ereditarietà multipla delle classiRiepilogo: gerarchia dei dipendenti7Metodi speciali e classe Object
Metodo toString()equals() e hashCode()Metodo clone()compareTo() e ComparableInterfaccia ComparatorRiepilogo - Ordinamento personalizzato2Modificatori di accesso e incapsulamento
Panoramica dei livelli di accessoMetodi getter e setterNascondimento delle informazioniLa parola chiave finalRiepilogo - Gestore di conti bancari5Polimorfismo
Nozioni di base sull'overloading dei metodiOverride dei metodi (a runtime)Upcasting e downcastingL'operatore instanceofClassi e metodi astrattiRiepilogo - Calcolatore di forme8Concetti avanzati di OOP
Composizione vs ereditarietàAggregazione vs composizioneClassi interne, annidate e anonimeEnum e metodi degli EnumRecord (Java 16+)Classi sealed (Java 17+)11Modelli di progettazione Parte 1
Introduzione ai modelli di progettazionePattern SingletonPattern FactoryPattern BuilderPattern ObserverPattern Strategy3Proprietà di classe e membri statici
Variabili di istanza e staticheMetodi staticiBlocchi staticiCostanti (static final)Riepilogo - Contatore e utility6Interfacce e classi astratte
Introduzione alle interfacceImplementazione delle interfacceImplementazione di più interfacceMetodi default e static nelle interfacceClassi astratte e interfacce a confrontoInterfacce funzionaliRiepilogo: sistema di pagamento9Tipi generici
Introduzione ai tipi genericiClassi genericheMetodi genericiParametri di tipo con limitiCaratteri jolly (?, extends, super)Riepilogo - Contenitore generico12Modelli di progettazione – Parte 2
Pattern CommandPattern AdapterPattern DecoratorPattern Template MethodPattern StatePattern CompositePattern IteratorEsercitati da solo: Compilatore Java online