back to top

Java: i modificatori final e static

Abbiamo fino a questo momento parlato degli aspetti principali della programmazione ad oggetti. Prima di analizzare l’ultimo concetto, le interfacce, è bene capire che effetto hanno i modificatori final e static nei vari contesti in cui sono inseriti.

Il modificatore final

Il modificatore final è molto semplice da comprendere in quanto le implementazioni possibili sono legate alla sua traduzione letterale: finale o non mutabile.

Dunque, il modificatore final può essere utilizzato, come abbiamo visto all’inizio di questa guida, per definire una variabile che di fatto diverrà una costante per l’istanza della classe. Final può essere applicato anche ai metodi di una determinata classe e un metodo definito come final (finale non modificabile) implica che se eredito la classe che contiene il metodo su questo non potrà essere eseguito l’override. Anche per quanto riguarda una classe questa può essere definita come final e di conseguenza una classe definita in questo modo non potrà essere ereditata. Ciò è logicamente comprensibile in quanto se dichiaro una classe con il modificatore final intendo una classe finale ovvero una classe completa che non necessita di specializzazioni o estensioni e dunque è più che logico che non sia possibile ereditarla.

Il modificatore static

Il modificatore static è invece un modificatore di più difficile comprensione, ma molto potente. Iniziamo con il dire che il modificatore static può essere applicato a metodi e a variabili di una classe. L’effetto di dichiarare un metodo static è quello di rendere il metodo di fatto comune a tutte le istanze della classe. Dunque, per chiarire meglio il concetto, pensiamo a tutte le funzioni matematiche che il Java ci mette a diposizione sfruttando la classe Math. La classe Math mette a disposizione un metodo statico che restituisce il massimo tra due interi e il risultato può essere ottenuto con il seguente codice:

Math.max(3,4);

La chiamata del metodo è un po’ diversa da quanto visto fino a questo punto della guida. La differenza più visibile è quella che non abbiamo istanziato la classe Math e non abbiamo richiamato il metodo max utilizzando la normale sintassi nomeOggetto.nomeMetodo(). Dunque se dichiariamo un metodo static potremo evitare di istanziare la classe che lo contiene e richiamare il metodo statico con la sintassi: nomeClasse.nomeMetodo(). Questo è possibile perchè la classe che modella il concetto di matematica è sempre lo stesso, per intenderci il valore massimo tra 3 e 4 sarà sempre 4; nulla potrà modificare tale relazione. Dunque si consiglia di utilizzare il modificatore static ai metodi in maniera parsimoniosa e solo se applicabile al concetto sopra esposto.

Vediamo adesso cosa succede quando si usa il modificatore static ad una variabile di istanza. Di fatto si rende l’attributo della classe comune a tutte le istanze della classe. Vediamo, con un esempio, questo concetto definendo una semplice classe prova con un solo attributo statico:

public class Prova {
  public static int numero;
}

La classe di implementazione per il nostro esempio sarà:

public class Implementazione {

  public static void main (String args[]) {
    Prova prova1 = new Prova();
    Prova prova2 = new Prova();
    prova1.numero=10;
    System.out.println("il valore numero per l'istanza 1 è: " + prova1.numero);
    System.out.println("il valore numero per l'istanza 2 è: " + prova2.numero);
  }
}

L’output relativo all’esecuzione della classe Implementazione sarà:

il valore numero per l'istanza 1 è 10;
il valore numero per l'istanza 2 è 10;

Dunque all’atto pratico se dichiariamo una variabile di istanza utilizzando il costrutto public static avremo come risultato il definire una variabile globale accessibile a tutte le istanze di una classe. Le variabili globali sono un arma a doppio taglio in quanto se il fatto di poter condividere una variabile con lo stesso valore per tutte le istanze della classe è sicuramente un vantaggio, si ha che nel caso in cui, per errore, un’istanza modifichi la variabile globale, tutte le altre istanze della classe troveranno il valore modificato compromettendo la robustezza dell’intera applicazione.

Pubblicitร