back to top

Incapsulamento Java: un esempio pratico

In questo articolo esploreremo il concetto di incapsulamento in Java, fornendo un esempio pratico per dimostrarne l’importanza e l’applicazione. L’incapsulamento è uno dei principi fondamentali della programmazione orientata agli oggetti, che ci permette di proteggere i dati interni di una classe e di controllare come questi vengono acceduti e modificati.

Cosa è l’Incapsulamento?

L’incapsulamento consiste nella pratica di raggruppare dati e metodi interni di una classe, limitando l’accesso diretto a tali dati. Questa tecnica è fondamentale per garantire l’integrità dei dati all’interno delle applicazioni e ridurre la complessità generale del codice. Utilizzando il modificatore di visibilità private, possiamo rendere gli attributi di una classe accessibili solo e esclusivamente dai metodi interni della stessa classe.

Pubblicità

Esempio di Incapsulamento in Java

Iniziamo a scrivere una classe che rappresenta un’anagrafica di una persona. Dichiareremo gli attributi nome e annoDiNascita come privati per proteggere i loro valori dall’accesso esterno:

public class Anagrafica {
  private String nome;
  private int annoDiNascita;  
}

Con questa dichiarazione, abbiamo reso gli attributi non accessibili esternamente. Se provassimo a istanziare la classe e accedere agli attributi con l’operatore ., il compilatore genererebbe un errore indicando che nome e annoDiNascita non sono visibili.

Creazione dei Metodi Getter e Setter

Per poter accedere e modificare i dati contenuti nella classe Anagrafica, dobbiamo creare dei metodi pubblici detti getter e setter:

public class Anagrafica {
  private String nome;
  private int annoDiNascita;
  
  public void setNome(String n) {
    nome = n;  
  }
    
  public String getNome() {
    return nome;      
  }
    
  public void setAnnoDiNascita(int anno) {
    annoDiNascita = anno;
  }

  public int getAnnoDiNascita() {
    return annoDiNascita;
  }
}

Abbiamo così creato metodi per impostare e recuperare i valori degli attributi, garantendo un accesso controllato.

Classe di Implementazione

Ora possiamo procedere a scrivere la nostra classe di implementazione:

public class Implementazione {
  public static void main(String[] args) {
    Anagrafica anagrafica = new Anagrafica();
    anagrafica.setNome("Matteo");
    anagrafica.setAnnoDiNascita(1987);
  }
}

Se eseguiamo la classe Implementazione, assegniamo il nome “Matteo” e l’anno di nascita “1987” alla nostra istanza della classe Anagrafica.

Il Vantaggio dell’Incapsulamento

Fino a questo momento, magari non sono visibili immediatamente i vantaggi dell’incapsulamento. Immaginiamo, però, di voler implementare un controllo sulla data di nascita per limitare l’accesso a determinate risorse. Potremmo modificare il metodo setAnnoDiNascita(int anno) in questo modo:

public void setAnnoDiNascita(int anno) {
  if (anno >= 1990 && anno <= 2000) {
    annoDiNascita = anno;
  } else {
    System.out.println("Non puoi accedere");
  }
}

Con questa modifica, abbiamo la possibilità di controllare che il valore assegnato soddisfi certe condizioni, senza dover alterare il resto del codice, in particolare la classe Implementazione. Questo approccio illustra il principio del riuso del codice.

Incapsulamento Funzionale

Finora abbiamo ottenuto un incapsulamento per gli attributi della classe. Applicando il modificatore private anche ai metodi, otteniamo un incapsulamento funzionale. Quest’ultimo mira a semplificare ulteriormente l’interfaccia della classe di implementazione, consentendo di raggruppare più metodi di impostazione in un’unica interfaccia pubblica. Ecco un esempio di come potrebbe apparire:

private void setDati(String n, int anno) {
  setNome(n);
  setAnnoDiNascita(anno);
}

In questo modo, se provessimo ad accedere al metodo dall’esterno, ci troveremmo di fronte allo stesso errore che abbiamo avuto cercando di accedere a un attributo privato della classe.

Pubblicità
Articolo precedente
Articolo successivo