Last Updated on 2 anni | Published: 17/04/2024
Modificatori di Accesso
Nell’ articolo in cui si è discusso di Classi Semplici abbiamo affrontato l’ argomento relativo alla visibilità degli oggetti dichiarati nei metodi e quindi visibili solo all’ interno del suo blocco, come anche gli attributi di classe sono visibili in tutti i metodi della classe in cui sono contenuti.
Ovviamente questa è una prima caratteristica del compilatore Java ma in realtà dobbiamo vedere quali sono i modificatori di accesso utilizzabili nei nostri programmi, che permettono di restringere l’ area di visibilità di variabili, metodi e classi.
Un primo modificatore che è stato utilizzato spesso nel nostro codice è public, infatti esso è presente quando si implementa una classe o un metodo. Se ad esempio una classe non è public ma private non si può istanziare, se un metodo non è public non si può accedere anche se la classe è public. Riportiamo di seguito una tabella che mostra i vari modificatori di accesso in relazione ad un progetto Java suddiviso in packge:
Come esempio implementiamo una classe Calcoli che abbia alcuni attributi dichiarati di classe e quindi visibili in tutti i metodi della classe stessa, cerchiamo di capire con un esempio pratico come restringere l’ area di visibilita di quest’ ultimi:
Partendo dal presupposto che la Classe Test e la classe Calcoli sono nello stesso package (vedi progetto), possiamo notare che utilizzando l’ oggetto calc nel metodo main (vedi classe Test) è possibile accedere anche agli attributi della classe Calcoli ovvero matricola e nome, (vedi classe Calcoli).
In questo esempio gli operatori di accesso degli attributi nome e matricola sono di default in quanto non specificati e quindi essi saranno visibili in tutte le classi e sottoclassi dello stesso package (vedi schema degli operatori mostrato in precedenza).
Possiamo riscrivere la classe Calcoli in modo tale che l’ area di visibilità degli attributi possa essere ristretta, quindi utilizzeremo l’operatore di accesso private.
Se il modificatore di accesso è private significa che gli attributi di classe restano incapsulati nell’ oggetto e gestiti soltanto attraverso i metodi.
In questa classe ad esempio l’ attributo nome essendo private è gestito attrraverso due metodi, implementati per assegnargli un valore, insertNome() oppure per ottenere ciò che contiene, dammiNome().
Classi JavaBean - Getter-Setter
Le JavaBean sono classi scritte secondo una particolare convenzione ed utilizzate per incapsulare più oggetti in un oggetto singolo (Bean), inoltre deve fornire metodi per impostare ed ottenere i valori degli attributi private (metodi get e set). Vediamo quindi come gestire una forma di persistenza degli attributi attraverso oggetti bean:
Il modello (JavaBean) in questione è la classe Auto con i suoi attributi private (vedi classe Auto).
Eclipse mette a disposizione una scorciatoia con il destro del mouse posizionato nel blocco della classe per generare in automatico i metodi get/set e gestire gli attributi privati marca, modello, colore e porte.
Il programmatore può decidere quali metodi inserire e dove posizionarli, ovviamente l’ esempio mostra l’ utilizzo di tutti i metodi generati in automatico, come si può osservare nell’ immagine successiva:
Costruzione di Oggetti - Auto
La classe Auto (Vedi classe Auto) non implementa un costruttore con parametri, pertanto la costruzione di oggetti avviene attraverso istanze e metodi set/get per ogni attributo di classe, come mostrato nel metodo main() della classe Test:
Costruttore con Parametri
Sempre nell’ articolo relativo alla costruzione di Classi Semplici ci siamo soffermati anche sul metodo costruttore assegnato di default dal compilatore Java per ogni classe presente nel progetto. Sebbene questo sia sempre vero è possibile implementare una classe, ad esempio il JavaBean Auto, con un costruttore con parametri (Fields). Sfruttando gli automatismi di Eclipse e come già abbiamo fatto per il costruttore di default è possibile posizionarci nel blocco della classe Auto e con il destro del mouse selezionare le voci indicate:
La fase successiva ci obbliga a selezionare gli attributi da includere nel metodo costruttore. Infatti il compito di quest’ ultimo è sempre lo stesso, ovvero creare l’ istanza in memoria, solo che con questo metodo è possibile assegnare i valori agli attributi in fase di istanza:
Ecco il risultato finale dopo la generazione automatica del metodo costruttore con parametri:
Quindi implementando il metodo main() della classe Test è possibile costruire oggetti di tipo Auto con attributi assegnati in fase di istanza:
Metodo toString()
Il metodo toString() è un metodo predefinito in Java che viene ereditato da tutte le classi perché è definito nella classe base Object. La sua funzione principale è quella di restituire una rappresentazione in forma di stringa dell’oggetto su cui viene chiamato.
Tuttavia, è comune per le classi personalizzate sovrascrivere il metodo toString() per fornire una rappresentazione più significativa e leggibile dell’oggetto. Questo può includere l’output di vari attributi dell’oggetto in un formato ben definito.
Ad esempio, una classe Auto potrebbe sovrascrivere il metodo toString() per restituire una stringa che include la marca, il modello, colore e porte di un’ auto in un formato leggibile.
Con la schermata successiva si possono includere nel toString() gli Attributi desiderati e specificare dove posizionarlo nella classe:
Il risultato finale nel modello Auto sarà il seguente:
L’ Annotation @Override stà ad indicare che il metodo toString() è ereditato dalla superclasse Object, che il compilatore assegna ad ogni classe, quindi è la superclasse di tutte le classi, anche se non specificato in fase di implementazione.
Ecco come il metodo main() della classe Test si implementa tenendo conto della presenza del toString() nel modello Auto:
La riga 14 stampa in console lo stato dell’ oggetto auto1, che a differenza della riga 11 sfrutta la presenza del toString(), infatti solo se il modello implementa tale metodo è possibile ottenere lo stato dell’ oggetto riferendosi all’ oggetto stesso. Ovviamente in fase di implementazione il metodo toString() può essere modificato secondo le proprie esigenze.
Nel prossimo articolo verrà spiegato il concetto di incapsulamento che nel contesto della programmazione orientata agli oggetti una classe può incapsulare anche oggetti di altre classi oltre che nascondere gli attributi con private ed accedervi mediante metodi pubblici, come è stato spiegato negli articoli precedenti ……..
LABORATORIO
L’ esempio seguente mostra come gestire operazioni CRUD su un array stringa primitivo. Il progetto è stato realizzato con più classi ed è possibile importarlo in Eclipse prospettiva SE:
-
gestionearray.zip
(zip, 7KB)
-
L’ esempio seguente mostra come utilizzare le classi JavaBean o comunemente dette classi modello. Il progetto è stato realizzato con più classi ed è possibile importarlo in Eclipse prospettiva SE:
-
javabean.zip
(zip, 6KB)
-
Progetto da importare in Eclipse prospettiva SE che implementa una classe JavaBean per la gestione di un array primitivo di tipo stringa su cui bisogna costruire delle operazioni di CRUD (Create-Read-Update-Delete).
-
javabeanarray.zip
(zip, 8KB)
-
Il costruttore è un metodo importante dal punto di vista delle implemantazioni di classi modello o JavaBean, infatti provvede alla giusta allocazione dell’ oggetto in memoria in fase di istanza. Questo costruttore è di default ma esiste anche quello con i parametri (Fields) che assegna i valori agli attributi in fase di istanza, quindi un modo rapido per creare oggetti. Importare in Eclipse prospettiva SE il seguente progetto che implementa un javabean per popolare un array di tipo stringa:
-
costruttore.zip
(zip, 4KB)
-
Il progetto da importare in Eclipse prospettiva SE implementa una logica attraverso il metodo costruttore (Fields) ed una classe Generica per popolare di auto un array stringa e visualizzarne il contenuto. L’ esercizio utilizza un modello di classe Autovettura:
-
progettocostruttore.zip
(zip, 7KB)
-
Spesso i JavaBean contengono il metodo @Override toString(), ovvero il programmatore decide di utilizzare questo metodo, ereditato dalla classe Object, per ottenere attraverso il solo oggetto del JavaBean lo stato degli attributi. Importare il progetto in Eclipse prospettiva SE
-
javabeantostring.zip
(zip, 6KB)
-
