Articolo originale: https://www.freecodecamp.org/news/java-getters-and-setters/

I getter e i setter vengono usati per proteggere dati, in particolar modo quando si creano delle classi.

Per ogni variabile di istanza, un metodo getter restituisce il suo valore, mentre un metodo setter ne imposta o ne aggiorna il valore. Per questo motivo, getter e setter sono anche conosciuti rispettivamente come accessor e mutator.

Per convenzione, i getter iniziano con la parola "get" e i setter iniziano con la parola "set", seguita dal nome della variabile. In entrambi i casi la prima lettera del nome della variabile è maiuscola:

public class Vehicle {
  private String color;
  
  // Getter
  public String getColor() {
    return color;
  }
  
  // Setter
  public void setColor(String c) {
    this.color = c;
  }
}

Il metodo getter restituisce il valore dell'attributo. Il metodo setter prende un parametro e lo assegna all'attributo.

Una volta che il getter e il setter sono stati definiti, li possiamo usare nel main:

public static void main(String[] args) {
  Vehicle v1 = new Vehicle();
  v1.setColor("Red");
  System.out.println(v1.getColor());
}

// l'output è "Red"

Getter e setter permettono di avere controllo su dei valori. Potresti anche validare il valore dato nel setter prima di impostarlo effettivamente.

Perché usare getter e setter?

Getter e setter ti permettono di controllare il modo in cui le variabili nel tuo codice sono consultate e aggiornate. Ad esempio, considera questo metodo setter:

public void setNumber(int number) {
  if (number < 1 || number > 10) {
    throw new IllegalArgumentException();
  }
  this.number = num;
}

Usando il metodo setNumber, puoi essere sicuro che il valore di number sia sempre tra 1 e 10. Molto più conveniente rispetto ad aggiornare direttamente la variabile number:

obj.number = 13;

Se aggiorni direttamente number, è possibile che si verifichino dei possibili effetti indesiderati da qualche parte nel codice. In quest'esempio, impostare number su 13 viola il vincolo che volevamo stabilire, per cui il suo valore deve essere compreso tra 1 e 10.

Rendere number una variabile privata e usare il metodo setNumber impedisce che questo accada.

D'altra parte, l'unico modo per leggere il valore di number è l'uso di un metodo getter:

public int getNumber() {
  return this.number;
}