Classi Libro e Utente
Fa parte della sezione Programmazione orientata agli oggetti del percorso Java di Coddy. Lezione 78 di 87.
Sfida
FacileContinuiamo a sviluppare il Library Management System ampliando le classi Book e User della lezione precedente. Ora aggiungerai la possibilità per gli utenti di prendere in prestito libri, creando un vero collegamento tra queste due entità.
Organizzerai il codice in tre file:
Book.java: migliora la classe Book della sfida precedente. Mantieni tutte le funzionalità esistenti (isbn, title, author, isAvailable con getter/setter egetDetails()). Aggiungi ora un campo privatoborrowedBydi tipoStringche memorizza l’ID dell’utente che ha preso in prestito il libro (oppurenullse non è stato preso in prestito). Aggiungi un getter perborrowedBye un setter che aggiorna ancheisAvailabledi conseguenza: quando un libro viene preso in prestito (borrowedBy viene impostato su un valore non null), non è più disponibile; quando viene restituito (impostato su null), torna disponibile.User.java: amplia la classe User per tenere traccia dei libri presi in prestito. Mantieni id, name, il costruttore, i getter etoString(). Aggiungi un campo privatoArrayList<Book>chiamatoborrowedBooks(inizializzalo nel costruttore). Crea un metodoborrowBook(Book book)che aggiunge il libro all’elenco dell’utente e impostaborrowedBydel libro sull’ID di questo utente. Crea un metodoreturnBook(Book book)che rimuove il libro dall’elenco e impostaborrowedBysu null. Aggiungi un metodogetBorrowedCount()che restituisce quanti libri ha attualmente l’utente.Main.java: mostra il sistema di prestito in azione. Riceverai cinque input: ISBN, titolo e autore di un libro, quindi ID e nome dell’utente.Crea un Book e un User con questi input. Stampa i dettagli e lo stato di disponibilità del libro. Poi fai prendere in prestito il libro all’utente. Stampa di nuovo la disponibilità del libro, seguita da chi lo ha preso in prestito nel formato
Borrowed by: [userId]. Stampa quanti libri ha l’utente nel formato[name] has [count] book(s). Infine, fai restituire il libro all’utente e stampa ancora una volta la disponibilità.
Riceverai cinque input nell’ordine seguente: ISBN (String), titolo (String), autore (String), ID utente (String) e nome utente (String).
Per esempio, con gli input 978-0-13-468599-1, Effective Java, Joshua Bloch, U001 e Alice, il tuo output sarà:
[978-0-13-468599-1] Effective Java by Joshua Bloch
Available: true
Available: false
Borrowed by: U001
Alice has 1 book(s)
Available: trueQuesta sfida si basa direttamente sul lavoro precedente e aggiunge la relazione fondamentale tra libri e utenti che rende funzionale un sistema bibliotecario. Userai la composizione (User "has" Books) e vedrai come le modifiche a un oggetto possono influire su un altro grazie a metodi ben progettati!
Provalo tu
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// Leggi le informazioni sul libro
String isbn = scanner.nextLine();
String title = scanner.nextLine();
String author = scanner.nextLine();
// Leggi le informazioni sull'utente
String userId = scanner.nextLine();
String userName = scanner.nextLine();
// Crea un oggetto Book con isbn, title e author
Book book = new Book(isbn, title, author);
// Crea un oggetto User con userId e userName
User user = new User(userId, userName);
// Stampa i dettagli del libro usando getDetails()
System.out.println(book.getDetails());
// Stampa se il libro è disponibile (formato: "Available: true" o "Available: false")
System.out.println("Available: " + book.isAvailable());
// Fai prendere in prestito il libro all'utente
user.borrowBook(book);
// Stampa di nuovo la disponibilità del libro
System.out.println("Available: " + book.isAvailable());
// Stampa chi ha preso il libro in prestito
System.out.println("Borrowed by: " + book.getBorrowedBy());
// Stampa quanti libri ha l'utente
System.out.println(user.getName() + " has " + user.getBorrowedCount() + " book(s)");
// Fai restituire il libro all'utente
user.returnBook(book);
// Stampa ancora una volta la disponibilità
System.out.println("Available: " + book.isAvailable());
}
}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 personalizzato10Gestione delle eccezioni in OOP
Gerarchia delle classi di eccezioneEccezioni personalizzateEccezioni controllate e non controllatePattern try-with-resourcesRiepilogo - Utente validato13Progetto: Gestione della biblioteca
Panoramica del progetto e progettazione UMLClassi Libro e UtenteSistema di prestitoFunzionalità di ricercaInterfaccia amministratoreIntegrazione della gestione delle eccezioniTest e integrazione2Modificatori 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