I libri possono essere sbagliati o fuorvianti. È certamente vero che avere getter e setter per ogni campo fornisce un po 'più di incapsulamento di quello che quei campi siano pubblici, ed è un peccato che questo tipo di design sia molto diffuso.
Ma non ha senso concludere che getter e setter dovrebbero essere evitati del tutto. Invece, dovrebbero essere aggiunti deliberatamente, se del caso, come parte del design API della classe:
- Se tutto ciò che un campo può essere gestito da metodi specifici del dominio, non avere un getter o setter - questo è il caso migliore.
- Se il valore di un campo è di per sé utile e necessario per altre classi, aggiungi un getter (non un setter)
- Se i campi rappresentano qualcosa come un valore di configurazione, un modo per il comportamento dell'oggetto di essere influenzato dall'esterno, aggiungere un setter (e un getter se la conoscenza di questa configurazione potrebbe essere utile anche ad altre classi).
Un comparatore può essere visto come un esempio per il caso 2, specialmente se il Comparatore viene usato deliberatamente invece di avere l'implementazione di classe Comparable. Ciò indica che la logica di confronto è esterna alla classe e dipende dal campo, quindi il campo è utile al di fuori della classe.
Un compromesso potrebbe essere quello di avere un pacchetto privato (visibilità predefinita) getter e mantenere il comparatore nello stesso pacchetto - o addirittura averlo come una classe interna che accede al campo privato. Ciò sarebbe appropriato se si desidera che la classe stessa offra una scelta di diversi ordinamenti.
Se la tua unica preoccupazione è che l'ordinamento possa cambiare a livello globale in futuro, rimarrò effettivamente con Comparable
- è ancora un cambiamento in una volta, non c'è bisogno di separarlo artificialmente.