Esempio Java: classe Impiegato

Un esempio semplice introduttivo per comprendere il funzionamento di una classe col codice. Per tutte le considerazioni teoriche, vi rimando qui alla lezione precedente.

Attributi

La prima parte della nostra classe comprende gli attributi. Come dichiarare gli attributi privati sia di tipo semplice come double e char, sia di tipo complesso come String e LocalDate? Notate come i tipi semplici comincino con la lettera piccola mentre quelli strutturati sotto forma di classe cominci invece con la maiuscola.

Per ogni attributo abbiamo realizzato i metodi di accesso set e get. Se nei primi esempi vale la pena scriverli a mano, è anche vero che molti IDE di sviluppo offrono strumenti automatici per la loro generazione.

  • Su IntellJ ad esempio basta premere il tasto destro a vuoto e trovare la voce Generate nella tendina che si apre, cliccando Setter & Getter e selezionando con il tasto Ctrl premuto tutti gli attributi.
  • Su NetBeans, tasto destro a vuoto, voce Insert Code, setter & getter anche qui

Sono indicati con l’intestazione private, ovvero non sono accessibili direttamente all’esterno della classe ma possono essere modificati e reperiti con i metodi set e get. Sono fondamentalmente variabili di due tipi: primitivi e semplici. I tipi di primitivi sono i classici int, float, double, boolean, char. Iniziano con la lettera piccola. Gli altri tipi più complessi sono String per la gestione delle stringhe di testo e LocalDate. Sono delle vere e proprie classi standard che mettono a disposizione del programmatore numerose funzioni/metodi pubblici di utilità per la manipolazione di stringhe di testo e data, ovviamente. Quando creiamo una classe, come qui Impiegato, non è un caso se abbiamo messo la I maiuscola, proprio per distinguere quella che sarà la variabile di tipo Impiegato, complessa e strutturata, da una semplice.

Costruttori

Il costruttore è una delle componenti di una classe che merita una particolare attenzione per lo studente al primo approccio con la OOP. Sino a ieri, con la programmazione tradizionale, ci siamo abituati a dichiarar delle variabili semplici e, spesso, ad inizializzarle con un valore di default. Creare una variabile assegnandogli un valore, equivale ad istanziare quella contenitore.

Il costruttore è un particolare metodo della classe il cui compito è proprio quello di creare nuove istanze, una nuova variabile non di tipo primitivo ma di tipo complesso che contiene tutti gli attributi e metodi della classe stessa. Nel momento che assegno una nuova variabili di tipo classe con un costruttore, do vita non allo scheletro, ma ad una versione di quella classe con veri e propri valori, uno stato che può essere manipolato all’interno del software, evolversi, essere aggiornato o cancellato.

In Java, come nella quasi totalità dei linguaggi OOP, possono esserci molteplici costruttori per una medesima classe, ognuno con parametri di diversi, e ne esiste sempre almeno di default senza parametri, se non ne è esplicitamente dichiarato uno. Occhio: se dichiaro un costruttore con una qualsiasi combinazione di parametri, il costruttore di default vuoto deve essere esplicitamente riscritto.

Qui abbiamo creato un costruttore vuoto senza parametri che però inizializza l’attributo sesso e un a data di nascita fittizia, lasciando restanti stringhe e numeri di default. Il secondo costruttore prende un sottoinsieme degli attributi più esteso.

Occhio che mentre tutti i metodi devono avere un tipo di ritorno come funzioni, il costruttore è l’unica che si dichiara con public Nomedellaclasse, stando ben attenti alle lettere maiuscole e minuscole con cui abbiamo chiamato la classe stesa.

Metodi

SET e GET

Sono i metodi di accesso agli attributi. Intuitivamente set imposta un valore all’attributo omonimo, get ne preleva il valore per stamparlo o usarlo in altro contesto di codice. E’ una pura convenzione chiamarli setNomeattributo() e getNomeattributo() ma piuttosto consolidata in tutti i linguaggi OOP (tranne in X++ un linguaggio di casa Microsoft dove hanno deciso di chiamarli parmNomeattributo(), ma è una stranezza tutta Microsoft ). Qui li abbiamo scritti di default ma possono essere arricchiti di controlli e messaggi vari. Ad esempio i set potrebbero avere dei controlli con if e cicli che impediscono di inserire valori non validi per le variabili, stringhe troppo corte o in cui sono presenti caratteri non validi ecc

GENERICI

Seppur questa sia una classe decisamente didattica, oltre ai set e get, è facile che una classe abbia degli ulteriori metodi che svolgano determinate operazioni, stampe, calcoli vari. Qui ne aggiungiamo uno, printAnagrafica, che ad esempio preleva tutti i campi attributi e li stampa in una forma carina.

Listato

Ecco il nostro codice completo.

import java.time.LocalDate;

public class Impiegato
{
    private String cf;
    private String nome;
    private String cognome;
    private LocalDate datadinascita;
    private char sesso;
    private LocalDate dataassunzione;
    private double  stipendiobase;

    public Impiegato()
    {
        this.datadinascita = LocalDate.of(1970,1,1);
        this.sesso ='M';
    }


    public Impiegato(String _nome, String _cognome, double _stipendiobase)
    {
        this.nome = _nome;
        this.cognome = _cognome;
        this.stipendiobase = _stipendiobase;
        this.sesso ='M';
        this.datadinascita = LocalDate.of(1970,1,1
    }


    public String getCf() {
        return cf;
    }

    public void setCf(String cf) {
        this.cf = cf;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCognome() {
        return cognome;
    }

    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    public LocalDate getDatadinascita() {
        return datadinascita;
    }

    public void setDatadinascita(LocalDate datadinascita) {
        this.datadinascita = datadinascita;
    }

    public char getSesso() {
        return sesso;
    }

    public void setSesso(char sesso) {
        this.sesso = sesso;
    }

    public Date getDataassunzione() {
        return dataassunzione;
    }

    public void setDataassunzione(Date dataassunzione) {
        this.dataassunzione = dataassunzione;
    }

    public double getStipendiobase() {
        return stipendiobase;
    }

    public void setStipendiobase(double stipendiobase) {
        this.stipendiobase = stipendiobase;
    }

    void printAnagrafica()
    {
        System.out.println("|----------------------------------------|");
        System.out.println("|Nome: " + this.nome);
        System.out.println("|Cognome: " + this.cognome);
        System.out.println("|Sesso: " + this.sesso);
        System.out.println("|Data di nascita: " + this.datadinascita.toString());
        System.out.println("|----------------------------------------|");
    }
}

Ultima modifica 17 Ottobre 2022