Una delle cose che vedi in molti posti nella libreria java standard sono le classi finali. Si sostiene che questo è per immutabilità che capisco ... in parte.
Supponi di avere una classe:
final public class ImmutableTest {
private String value;
public ImmutableTest(String value) {
this.value = value;
}
public String getValue() {
return this.value;
}
}
Si può dire che il valore è immutabile perché non può essere adattato dopo la creazione. Tuttavia, ciò limita l'usabilità della classe in quanto nessuno può estenderla (ad esempio, può essere utilizzata come drop-in per un design male interfacciato ...).
Ora supponi di avere questa classe:
public class ImmutableTest {
private String value;
public ImmutableTest(String value) {
this.value = value;
}
final public String getValue() {
return this.value;
}
}
Il "valore" è ancora immutabile, ma ora almeno le persone possono estendere la classe. Qualcuno una volta si è interposto: ma se lo estendi, la classe estesa non è garantita per essere immutabile!
Anche se questo è vero, penso che sia irrilevante per la classe stessa.
Se l'utente A usa la mia classe ImmutableTest ovunque nel suo codice, ha comunque accesso al "valore" comunque che rimane immutabile . A meno che non faccia un casting esplicito (in altre parole: è consapevole che sta tentando di accedere ad altre cose) non può accedere a una parte "mutabile" dell'istanza reale, il che significa che dal punto di vista dello sviluppatore la classe è immutabile come dovrebbe essere, anche se l'istanza attuale ha altre variabili modificabili.
In breve: la mia opinione è che le lezioni finali sono superflue in quanto i metodi finali sono tutto ciò che serve. Mi piacerebbe comunque sentire argomenti contrari!
Aggiorna
Per chiarire: non sto affermando che aggiungere "finale" a una classe o ai suoi metodi lo rende immutabile.
Supponiamo di avere una classe progettata per essere immutabile, ma non si rendono i metodi o la finale di classe, una sottoclasse può ovviamente renderla nuovamente mutabile. Questo argomento viene utilizzato per spiegare perché alcune classi nella libreria standard sono finali. La mia opinione è che avrebbe dovuto essere sufficiente per finalizzare i metodi di accesso alla parte immutabile e lasciare la classe non definitiva.
Questo potrebbe lasciare la finestra aperta agli oggetti secondari aggiungendo i campi mutabili ma l'insieme originale di campi rimarrebbe immutabile, soddisfacendo quindi il requisito "immutabile" per l'insieme iniziale di metodi.
UPDATE2
La conclusione è che le classi finali non hanno uno scopo reale tranne forse una brevità che di per sé non è una ragione sufficiente per perdere l'estensibilità secondo me.