Skip to content

Latest commit

 

History

2 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Java Dealership

Gestionale di un concessionario con interfaccia grafica in Java, costruito su una gerarchia di veicoli e un contenitore generico con tipo limitato.

Progetto realizzato come prova d'esame del modulo Java, all'interno del percorso formativo Web Developer AI presso la Steve Jobs Academy (Catania). La traccia era libera: la scelta del dominio e della struttura delle classi è mia.

Il materiale teorico su cui ho preparato l'esame è raccolto nella guida a Java che ho scritto durante il modulo.


L'idea alla base

Un concessionario vende mezzi diversi tra loro, ma tutti condividono le stesse informazioni di base: una marca, un modello, un prezzo. Quello che cambia è ciò che li rende specifici — un'auto ha un numero di porte, una moto può avere o meno il bauletto.

È il caso tipico dell'ereditarietà: invece di ripetere marca, modello e prezzo in ogni classe, li si dichiara una volta sola in una classe madre.

Vehicle è dichiarata abstract perché nella realtà non si compra un "veicolo generico": si compra un'auto o una moto. La classe madre esiste per essere ereditata, non per essere istanziata.

public abstract class Vehicle {

    private String brand;
    private String model;
    private double price;

    public Vehicle(String brand, String model, double price) {
        this.brand = brand;
        this.model = model;
        this.price = price;
    }
    // ...
}

Le classi

Classe Ruolo Campo specifico
Vehicle Classe astratta madre marca, modello, prezzo
Car Sottoclasse doorsNumber — numero di porte
Motorcycle Sottoclasse topCase — presenza del bauletto
Parking<T extends Vehicle> Contenitore generico gestisce la collezione di veicoli

Entrambe le sottoclassi richiamano il costruttore della classe madre con super e aggiungono il proprio campo distintivo.


Il parcheggio generico

Parking è la parte tecnicamente più interessante del progetto:

public class Parking<T extends Vehicle> {

    private ArrayList<T> vehicles = new ArrayList<>();

    public void updateVehiclePriceAt(int index, double newPrice) {

        if (index >= 0 && index < vehicles.size()) {

            T vehicle = vehicles.get(index);
            vehicle.setPrice(newPrice);

        } else {
            throw new IndexOutOfBoundsException("Posizione del veicolo non valida!");
        }
    }
    // ...
}

Il vincolo T extends Vehicle fa due cose insieme.

Impedisce inserimenti insensati. Un parcheggio accetta qualsiasi veicolo, ma solo veicoli. Scrivere Parking<String> produce un errore di compilazione, non un crash a runtime.

Rende possibile il codice sopra. La riga vehicle.setPrice(newPrice) compila solo perché il compilatore sa che T è un Vehicle e quindi possiede quel metodo. Senza il vincolo, con un semplice Parking<T>, quella chiamata non sarebbe consentita: il compilatore non avrebbe modo di sapere che T ha un prezzo.

Il contenitore interno è un ArrayList e non un array: la dimensione non è fissata in partenza, e aggiunte e rimozioni non richiedono di spostare manualmente gli elementi.


Protezione dei dati

L'incapsulamento non è applicato solo per convenzione. Il setter del prezzo rifiuta valori insensati:

public void setPrice(double newPrice) {

    if (newPrice <= 0) {
        throw new IllegalArgumentException("Il prezzo deve essere maggiore di 0");
    }

    this.price = newPrice;
}

Allo stesso modo, removeVehicle e updateVehiclePriceAt verificano che la posizione richiesta esista prima di agire, lanciando un'eccezione con un messaggio esplicito invece di lasciare che il programma fallisca in modo oscuro.


Concetti applicati

  • Classe astrattaVehicle come base comune non istanziabile
  • Ereditarietàextends e chiamata al costruttore madre con super
  • Incapsulamento — campi privati, accesso tramite getter e setter con validazione
  • Generici con tipo limitato<T extends Vehicle>
  • CollezioniArrayList per una raccolta a dimensione variabile
  • EccezioniIllegalArgumentException e IndexOutOfBoundsException lanciate con throw
  • instanceof — distinzione tra auto e moto in fase di visualizzazione

L'interfaccia grafica

Layout a tre colonne: il form di inserimento sulla sinistra, con un menu a tendina che cambia il campo specifico in base al tipo di mezzo selezionato, e due pannelli separati sulla destra per le automobili e le motociclette in stock.

Demo del gestionale

Nota sulla realizzazione: l'interfaccia grafica Swing è stata generata con l'assistenza dell'intelligenza artificiale, secondo l'indicazione esplicita del docente. L'obiettivo didattico del progetto riguardava la progettazione a oggetti, non la costruzione dell'interfaccia. La modellazione delle classi e la logica applicativa sono di mia realizzazione.


Compilazione ed esecuzione

Nessuna dipendenza esterna: Swing fa parte della libreria standard.

javac *.java
java DealershipGUI

Richiede un JDK installato. Verifica con javac --version.


Sviluppi possibili

  • Persistenza dei dati. L'elenco dei veicoli vive in memoria e si perde alla chiusura. Il salvataggio su file renderebbe il gestionale utilizzabile davvero.
  • Ricerca e ordinamento. Filtrare per marca o ordinare per prezzo sono le funzioni che mancano per primo a un gestionale reale.
  • Nuove tipologie di veicolo. La struttura è predisposta: aggiungere un Truck richiede solo una nuova sottoclasse di Vehicle, senza toccare Parking né le classi esistenti.
  • Sostituire instanceof con il polimorfismo. La GUI distingue auto e moto con dei controlli di tipo. Un metodo astratto in Vehicle, ridefinito da ogni sottoclasse, permetterebbe di ottenere lo stesso risultato senza chiedere all'oggetto cosa sia.

Tecnologie

  • Java — libreria standard, java.util.ArrayList
  • Swing per l'interfaccia grafica
  • Visual Studio Code come ambiente di sviluppo

Autore

Riccardo Mazza@Richard-WebDev Studente Web Developer AI, Steve Jobs Academy

About

Gestionale di un concessionario in Java con ereditarietà e generici con tipo limitato — progetto d'esame

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages