Supponiamo che tu stia costruendo un albero, una lista, un grafico e così via. Perché dovresti esporre i dettagli interni di un nodo o di una cella al mondo esterno?
Chiunque usi un grafico o una lista dovrebbe fare affidamento solo sulla sua interfaccia, non sulla sua implementazione, dal momento che potresti volere cambiarla un giorno nel futuro (ad esempio da un'implementazione basata su array a una basata su puntatori) e i client che utilizzano la struttura dei dati ( ognuno di essi ) dovrebbero modificare il loro codice per adeguarlo alla nuova implementazione.
Invece, incapsulare l'implementazione di un nodo o di una cella in una classe interna privata ti dà la libertà di modificare l'implementazione ogni volta che ne hai bisogno, senza che i client siano obbligati a modificare il loro codice di conseguenza, purché i tuoi dati l'interfaccia della struttura rimane intatta.
Nascondere i dettagli dell'implementazione della struttura dati comporta anche vantaggi in termini di sicurezza, perché se si desidera distribuire la classe si renderà disponibile solo il file di interfaccia insieme al file di implementazione compilato e nessuno saprà se si sta effettivamente utilizzando array o puntatori per la tua implementazione, proteggendo così la tua applicazione da qualche tipo di sfruttamento o, almeno, conoscenza dovuta all'impossibilità di usare impropriamente o ispezionare il tuo codice. Oltre ai problemi pratici, non sottovalutare il fatto che sia una soluzione estremamente elegante in questi casi.