Questa non è l'opinione più popolare, ma non vedo molta differenza.
Gli impostori e i getter sono una cattiva idea. Ci ho pensato e sinceramente non riesco a trovare una differenza tra un setter / getter e una variabile pubblica nella pratica.
In THEORY un setter e un getter aggiungono un posto dove fare alcune azioni extra quando una variabile viene impostata / ottenuta e in teoria isolano il tuo codice dai cambiamenti.
In realtà raramente vedo setter e getter usati per aggiungere un'azione, e quando vuoi aggiungere un'azione, devi aggiungerla a TUTTI i setter o getter di una classe (come la registrazione) che dovrebbe farti pensare che dovrebbe esserci una soluzione migliore.
Per quanto riguarda l'isolare le decisioni di progettazione, se cambi una int a una lunga devi ancora cambiare setter e almeno controllare ogni linea che le accede a mano - non c'è molto isolamento lì.
Le classi mutabili dovrebbero comunque essere evitate di default, quindi aggiungere un setter dovrebbe essere l'ultima risorsa. Questo è mitigato con il modello di builder in cui un valore può essere impostato fino a quando l'oggetto si trova in uno stato desiderato, quindi la classe può diventare immutabile e i setter generano eccezioni.
Per quanto riguarda i getter - non riesco ancora a trovare una grande differenza tra un getter e una variabile finale pubblica. Il problema qui è che in entrambi i casi è un cattivo OO. Non dovresti chiedere un valore a un oggetto e operare su di esso - dovresti chiedere a un oggetto di fare un'operazione per te.
A proposito, non sto affatto sostenendo le variabili pubbliche - sto dicendo che setter e getter (e anche proprietà) sono troppo vicini alle variabili pubbliche.
Il grosso problema è semplicemente che le persone che non sono programmatori OO sono troppo tentate di usare setter e getter per creare oggetti in palle di proprietà (strutture) che vengono passati in giro e gestiti, praticamente l'opposto di come orientato agli oggetti codice funziona.