È buna pratica limitare il più possibile la visibilità dei dati.
Nel momento in cui crei una classe devi cercare di fare il possibile per mascherare tutti i dettagli implementativi: quando vai ad utilizzare una classe la vedi come una black box (sai cosa fa, ma non sai come lo faccia) e nel momento in cui qualcuno va a cambiare la sua implementazione (eg. per migliorare le performance), questo cambiamento ti rimane completamente trasparente.
Si riducono anche gli errori, perché hai la sicurezza che alcuni dati possono essere modificati solo all'interno della classe, quindi in caso di problemi ti semplifichi la fase di debug.
Generalmente vale la regola: parti con tutto private e metti public solo quello che è strettamente necessario. Anche i dati che vuoi rendere effettivamente visibili all'esterno generalmente vorrai metterli private, creando due metodi public (eg. getVar e setVar) per renderli accessibili all'esterno.