Quando vengono utilizzati:
1) Quando si vuole dare un nome descrittivo alla
creazione di un oggetto;
2) Quando si ha bisogno di flessibilità nel tipo di
oggetto creato;
3) Quando si vuole ottimizzare la creazione di oggetti.
I vantaggi dei Factory methods sono:
1) Nome del metodo personalizzabile, a differenza
dei costruttori che devono avere lo stesso nome
della classe, i factory methods possono avere un
nome descrittivo;
2) Flessibilità del tipo di ritorno, può restituire un
oggetto di una subclass della casse stessa (può
restituire un oggetto appartenente ad una subclass
o riutilizzare oggetti esistenti).
Classi wrapper
Vengono utilizzate per convertire un tipo primitivo in un
oggetto.
Ogni tipo primitivo ha una corrispondente classe
wrapper che consente di rappresentare il valore
primitivo come un oggetto. Le classi wrapper sono
immutabili e final (dopo che sono state create il loro
valore non può essere modificato).
Per passare da un tipo primitivo ad un oggetto si utilizza
il metodo valueOf() (creare un’istanza di una classe
wrapper a partire da un tipo primitivo).
Per passare da un oggetto ad un tipo primitivo si utilizza
il metodo intValue() (da un’istanza di una classe
wrapper si ottiene il suo valore primitivo).
Autoboxing e unboxing
L’autoboxing è il processo automatico con cui Java
converte un valore primitivo in un’istanza della sua
corrispondente classe wrapper.
L’unboxing è il processo con cui un’istanza della classe
wrapper viene automaticamente convertita nel
corrispondente valore primitivo.
Le classi wrapper offrono metodi di utilità per lavorare
con i tipi primitivi in modo più flessibile. Un esempio è
Integer.parseInt(String s) che converte una stringa in un
valore primitivo int.
Main
Il metodo main è il punto di ingresso di ogni programma
Java (è il primo metodo che viene eseguito quando si
avvia un programma).
Le principali caratteristiche di un metodo main:
1) Statico, poiché i metodi static possono essere
invocati senza creare un’istanza della classe;
2) Invocazione automatica, al runtime la Java Virtual
Machine invoca automaticamente il metodo main;
3) Il metodo main non opera su alcun oggetto, poiché
al momento della sua esecuzione non esistono
ancora istanze.
Scope e distruzione di un oggetto
Lo scope di una variabile definisce dove essa è
accessibile e per quanto tempo rimane attiva. Gli
oggetti seguono regole di lifetime diverse dai tipi
primitivi poiché quando un riferimento esce dallo scope
potrebbe continuare ad essere presente in memoria fino
a quando il garbage collector non lo elimina.
La distruzione degli oggetti in Java avviene:
1) Garbage collection, Java gestisce
automaticamente la liberazione della memoria
tramite il garbage collector;
2) Assenza di distruttori, Java non supporta i
distruttori come meccanismo esplicito per
deallocare risorse.
Per gli oggetti che gestiscono risorse non di memoria è
importante gestire la chiusura di tali risorse (come, ad
esempio, il metodo close per eseguire le operazioni di
pulizia necessarie quando l’oggetto non viene più
utilizzato).
Metodi finalize e cleaner
Finalize è un metodo utilizzato per eseguire operazioni
di pulizia, tuttavia, è sconsigliata poiché è inefficiente
(non garantisce la tempestiva esecuzione della pulizia).
In Java 9 è stata introdotta la classe cleaner che
permette di registrare le azioni da eseguire
automaticamente quando un oggetto non è più
raggiungibile (approccio più sicuro).
I tre principi fondamentali della programmazione ad
oggetti
L’OOP si basa su tre pilastri fondamentali:
1) Incapsulamento, è il principio di nascondere i
dettagli interni di come un oggetto è implementato,
esponendo solo le operazioni che gli altri oggetti
possono utilizzare per interagire con esso;
2) Ereditarietà, permette di creare una nuova classe
che è una versione estesa di una classe esistente.
Questa nuova classe eredita attributi e metodi della
classe genitore, consentendo la riutilizzazione del
codice e la creazione di gerarchie di classi;
3) Polimorfismo, è la capacità di un’interfaccia di
essere implementata da diverse classi in modi
diversi. Permette di trattare oggetti di classi diverse
sotto la stessa interfaccia, rendendo il codice più
flessibile e riutilizzabile.
Incapsulamento
Perché si utilizza l’incasulamento?
1) Sicurezza dei dati, impedisce accessi esterni non
autorizzati agli attributi dell’oggetto, proteggendo
l’integrità e prevenendo usi impropri;
2) Facilità di manutenzione, permette di cambiare
l’implementazione interna senza influenzare le altre
parti del programma che utilizzano l’oggetto;
3) Riduzione di complessità, fornisce un’interfaccia
chiara per ogni oggetto.
Controllare la visibilità
La visibilità è la possibilità di accedere agli attributi e
metodi di una classe da altre parti del codice. La
visibilità è regolata dai modificatori di accesso.
I modificatori di visibilità determinano da dove gli
attributi e i metodi di una classe possono essere
accessibili.
1) Pubblica (public), accesso consentito da qualsiasi
parte del codice;
2) Privata (private), accesso consentito solo
all’interno della stessa classe;
3) Package (package), accesso consentito solo dalle
classi nello stesso package;
4) Protetta (protected), accesso consentito solo dalle
sottoclassi e dalle classi nello stesso package.
Package