Progetto Finale: Sistema di Gestione Biblioteca
๐ฏ Obiettivo del Progetto
Creare un Sistema di Gestione Biblioteca che utilizzi TUTTI i concetti appresi durante il corso:
- โ Classi e Oggetti
- โ Ereditarietร e Polimorfismo
- โ Interfacce e Classi Astratte
- โ Collezioni (ArrayList, HashMap)
- โ Eccezioni
- โ File I/O
- โ Incapsulamento
๐ Specifiche del Progetto
Funzionalitร richieste:
- Gestire libri, riviste e DVD
- Aggiungere/rimuovere elementi
- Prestiti e restituzioni
- Ricerca per titolo/autore
- Salvataggio su file
- Gestione utenti
๐๏ธ Architettura del Progetto
// ========== INTERFACCE ==========
interface Prestabile {
boolean prestito(String utente);
boolean restituzione();
boolean isDisponibile();
}
// ========== CLASSE ASTRATTA ==========
abstract class ElementoBiblioteca implements Prestabile {
protected String id;
protected String titolo;
protected int anno;
protected boolean disponibile;
protected String prestataA;
public ElementoBiblioteca(String id, String titolo, int anno) {
this.id = id;
this.titolo = titolo;
this.anno = anno;
this.disponibile = true;
this.prestataA = null;
}
@Override
public boolean prestito(String utente) {
if (disponibile) {
disponibile = false;
prestataA = utente;
return true;
}
return false;
}
@Override
public boolean restituzione() {
if (!disponibile) {
disponibile = true;
prestataA = null;
return true;
}
return false;
}
@Override
public boolean isDisponibile() {
return disponibile;
}
public String getId() { return id; }
public String getTitolo() { return titolo; }
public int getAnno() { return anno; }
public String getPrestataA() { return prestataA; }
public abstract String getTipo();
public abstract String getDettagli();
}
// ========== SOTTOCLASSI ==========
class Libro extends ElementoBiblioteca {
private String autore;
private int pagine;
public Libro(String id, String titolo, String autore, int anno, int pagine) {
super(id, titolo, anno);
this.autore = autore;
this.pagine = pagine;
}
@Override
public String getTipo() { return "Libro"; }
@Override
public String getDettagli() {
return getTipo() + " - " + titolo + " di " + autore +
" (" + anno + ") - " + pagine + " pagine";
}
public String getAutore() { return autore; }
}
class Rivista extends ElementoBiblioteca {
private int numero;
private String mese;
public Rivista(String id, String titolo, int numero, String mese, int anno) {
super(id, titolo, anno);
this.numero = numero;
this.mese = mese;
}
@Override
public String getTipo() { return "Rivista"; }
@Override
public String getDettagli() {
return getTipo() + " - " + titolo + " n." + numero +
" (" + mese + " " + anno + ")";
}
}
class DVD extends ElementoBiblioteca {
private String regista;
private int durata;
public DVD(String id, String titolo, String regista, int anno, int durata) {
super(id, titolo, anno);
this.regista = regista;
this.durata = durata;
}
@Override
public String getTipo() { return "DVD"; }
@Override
public String getDettagli() {
return getTipo() + " - " + titolo + " di " + regista +
" (" + anno + ") - " + durata + " min";
}
}
// ========== GESTIONE BIBLIOTECA ==========
import java.util.*;
import java.io.*;
class Biblioteca {
private HashMap catalogo;
private ArrayList storicoOperazioni;
private String nomeFile;
public Biblioteca(String nomeFile) {
this.catalogo = new HashMap<>();
this.storicoOperazioni = new ArrayList<>();
this.nomeFile = nomeFile;
caricaDati();
}
public void aggiungiElemento(ElementoBiblioteca elemento) {
if (catalogo.containsKey(elemento.getId())) {
System.out.println("ID giร esistente!");
return;
}
catalogo.put(elemento.getId(), elemento);
registraOperazione("Aggiunto: " + elemento.getDettagli());
salvaDati();
System.out.println("Elemento aggiunto con successo!");
}
public void rimuoviElemento(String id) {
ElementoBiblioteca elemento = catalogo.remove(id);
if (elemento != null) {
registraOperazione("Rimosso: " + elemento.getDettagli());
salvaDati();
System.out.println("Elemento rimosso!");
} else {
System.out.println("Elemento non trovato!");
}
}
public void prestito(String id, String utente) {
ElementoBiblioteca elemento = catalogo.get(id);
if (elemento == null) {
System.out.println("Elemento non trovato!");
return;
}
if (elemento.prestito(utente)) {
registraOperazione("Prestito: " + elemento.getTitolo() + " a " + utente);
salvaDati();
System.out.println("Prestito effettuato!");
} else {
System.out.println("Elemento non disponibile!");
}
}
public void restituzione(String id) {
ElementoBiblioteca elemento = catalogo.get(id);
if (elemento == null) {
System.out.println("Elemento non trovato!");
return;
}
if (elemento.restituzione()) {
registraOperazione("Restituzione: " + elemento.getTitolo());
salvaDati();
System.out.println("Restituzione effettuata!");
} else {
System.out.println("Elemento giร disponibile!");
}
}
public void cercaPerTitolo(String titolo) {
System.out.println("\n=== Risultati Ricerca ===");
boolean trovato = false;
for (ElementoBiblioteca elemento : catalogo.values()) {
if (elemento.getTitolo().toLowerCase().contains(titolo.toLowerCase())) {
stampaElemento(elemento);
trovato = true;
}
}
if (!trovato) {
System.out.println("Nessun risultato trovato");
}
}
public void mostraTutto() {
if (catalogo.isEmpty()) {
System.out.println("Catalogo vuoto!");
return;
}
System.out.println("\n=== Catalogo Completo ===");
for (ElementoBiblioteca elemento : catalogo.values()) {
stampaElemento(elemento);
}
}
public void mostraDisponibili() {
System.out.println("\n=== Elementi Disponibili ===");
boolean trovato = false;
for (ElementoBiblioteca elemento : catalogo.values()) {
if (elemento.isDisponibile()) {
stampaElemento(elemento);
trovato = true;
}
}
if (!trovato) {
System.out.println("Nessun elemento disponibile");
}
}
public void mostraPrestiti() {
System.out.println("\n=== Elementi in Prestito ===");
boolean trovato = false;
for (ElementoBiblioteca elemento : catalogo.values()) {
if (!elemento.isDisponibile()) {
System.out.println(elemento.getDettagli());
System.out.println(" โ Prestato a: " + elemento.getPrestataA());
System.out.println();
trovato = true;
}
}
if (!trovato) {
System.out.println("Nessun prestito attivo");
}
}
public void statistiche() {
int totale = catalogo.size();
int disponibili = 0;
int prestiti = 0;
int numLibri = 0, numRiviste = 0, numDVD = 0;
for (ElementoBiblioteca el : catalogo.values()) {
if (el.isDisponibile()) disponibili++;
else prestiti++;
if (el instanceof Libro) numLibri++;
else if (el instanceof Rivista) numRiviste++;
else if (el instanceof DVD) numDVD++;
}
System.out.println("\n=== Statistiche Biblioteca ===");
System.out.println("Totale elementi: " + totale);
System.out.println("Disponibili: " + disponibili);
System.out.println("In prestito: " + prestiti);
System.out.println("\nPer tipo:");
System.out.println(" Libri: " + numLibri);
System.out.println(" Riviste: " + numRiviste);
System.out.println(" DVD: " + numDVD);
}
private void stampaElemento(ElementoBiblioteca elemento) {
System.out.println("ID: " + elemento.getId());
System.out.println(elemento.getDettagli());
System.out.println("Stato: " + (elemento.isDisponibile() ? "Disponibile" : "Prestato"));
if (!elemento.isDisponibile()) {
System.out.println("Prestato a: " + elemento.getPrestataA());
}
System.out.println();
}
private void registraOperazione(String operazione) {
String timestamp = new java.util.Date().toString();
storicoOperazioni.add(timestamp + " - " + operazione);
}
private void salvaDati() {
try {
FileWriter writer = new FileWriter(nomeFile);
for (ElementoBiblioteca elemento : catalogo.values()) {
String riga = elemento.getTipo() + ";" +
elemento.getId() + ";" +
elemento.getTitolo() + ";" +
elemento.getAnno() + ";" +
elemento.isDisponibile() + ";" +
(elemento.getPrestataA() != null ? elemento.getPrestataA() : "");
writer.write(riga + "\n");
}
writer.close();
} catch (IOException e) {
System.out.println("Errore salvataggio: " + e.getMessage());
}
}
private void caricaDati() {
try {
File file = new File(nomeFile);
if (!file.exists()) return;
Scanner scanner = new Scanner(file);
while (scanner.hasNextLine()) {
String riga = scanner.nextLine();
// Parsing semplificato per l'esempio
// In un progetto reale, ci sarebbe piรน logica qui
}
scanner.close();
} catch (IOException e) {
System.out.println("Errore caricamento: " + e.getMessage());
}
}
}
// ========== MAIN ==========
import java.util.Scanner;
public class SistemaBiblioteca {
public static void main(String[] args) {
Biblioteca biblioteca = new Biblioteca("biblioteca.txt");
Scanner input = new Scanner(System.in);
// Aggiungo dati di esempio
biblioteca.aggiungiElemento(new Libro("L001", "1984", "George Orwell", 1949, 328));
biblioteca.aggiungiElemento(new Libro("L002", "Il Signore degli Anelli", "J.R.R. Tolkien", 1954, 1178));
biblioteca.aggiungiElemento(new Rivista("R001", "Focus", 350, "Gennaio", 2024));
biblioteca.aggiungiElemento(new DVD("D001", "Inception", "Christopher Nolan", 2010, 148));
while (true) {
System.out.println("\nโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
System.out.println("โ SISTEMA GESTIONE BIBLIOTECA โ");
System.out.println("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ");
System.out.println("1. Mostra catalogo completo");
System.out.println("2. Mostra disponibili");
System.out.println("3. Mostra prestiti");
System.out.println("4. Cerca per titolo");
System.out.println("5. Effettua prestito");
System.out.println("6. Effettua restituzione");
System.out.println("7. Aggiungi elemento");
System.out.println("8. Rimuovi elemento");
System.out.println("9. Statistiche");
System.out.println("0. Esci");
System.out.print("\nScelta: ");
int scelta = input.nextInt();
input.nextLine();
switch (scelta) {
case 1:
biblioteca.mostraTutto();
break;
case 2:
biblioteca.mostraDisponibili();
break;
case 3:
biblioteca.mostraPrestiti();
break;
case 4:
System.out.print("Titolo da cercare: ");
String titolo = input.nextLine();
biblioteca.cercaPerTitolo(titolo);
break;
case 5:
System.out.print("ID elemento: ");
String idPrestito = input.nextLine();
System.out.print("Nome utente: ");
String utente = input.nextLine();
biblioteca.prestito(idPrestito, utente);
break;
case 6:
System.out.print("ID elemento: ");
String idReso = input.nextLine();
biblioteca.restituzione(idReso);
break;
case 7:
// Qui andrร il codice per aggiungere elementi
System.out.println("Funzione da implementare");
break;
case 8:
System.out.print("ID elemento da rimuovere: ");
String idRimosso = input.nextLine();
biblioteca.rimuoviElemento(idRimosso);
break;
case 9:
biblioteca.statistiche();
break;
case 0:
System.out.println("Arrivederci!");
input.close();
return;
default:
System.out.println("Scelta non valida!");
}
System.out.print("\nPremi INVIO per continuare...");
input.nextLine();
}
}
}
โ๏ธ Esercizi di Estensione
Esercizio 1: Menu Aggiunta
FACILECompleta la funzione "Aggiungi elemento" nel menu principale
Esercizio 2: Date Prestiti
MEDIOAggiungi data di prestito e calcola giorni di ritardo
Esercizio 3: Storico Operazioni
MEDIOImplementa visualizzazione storico operazioni
Esercizio 4: Ricerca Avanzata
DIFFICILEAggiungi filtri multipli (tipo, anno, autore, disponibilitร )
Esercizio 5: Report PDF
DIFFICILEGenera report in formato PDF con statistiche
๐ฏ Concetti Utilizzati
โ Hai usato TUTTO quello che hai imparato!
- โ Classi e Oggetti: Libro, Rivista, DVD, Biblioteca
- โ Ereditarietร : ElementoBiblioteca โ sottoclassi
- โ Polimorfismo: HashMap di ElementoBiblioteca
- โ Interfacce: Prestabile
- โ Classi Astratte: ElementoBiblioteca
- โ Collezioni: HashMap e ArrayList
- โ Eccezioni: try-catch per I/O
- โ File I/O: salvataggio e caricamento
- โ Incapsulamento: private/protected/public
๐ Prossimi Passi
Hai completato il corso! Cosa fare ora?
- ๐ Rivedi le lezioni per consolidare
- ๐ป Estendi il progetto con nuove funzionalitร
- ๐ฎ Crea il TUO progetto personale
- ๐ Studia Java avanzato (thread, networking, GUI)
- ๐ Esplora Spring Boot per applicazioni web
- ๐ฑ Prova Android per app mobile
๐ Congratulazioni!
๐ HAI COMPLETATO IL CORSO! ๐
Ora sei pronto per sviluppare applicazioni Java complete!
Continua a programmare e sperimentare!
La pratica rende perfetti! ๐ช