Suponha que você esteja construindo uma árvore, uma lista, um gráfico e assim por diante. Por que você deve expor os detalhes internos de um nó ou uma célula ao mundo externo?
Qualquer pessoa que utilize um gráfico ou uma lista deve confiar apenas em sua interface, não em sua implementação, pois você poderá alterá-lo um dia no futuro (por exemplo, de uma implementação baseada em array para outra baseada em ponteiro) e nos clientes que usam seu a estrutura de dados ( cada uma delas ) precisaria modificar seu código para adequá-lo à nova implementação.
Em vez disso, encapsular a implementação de um nó ou célula em uma classe interna privada oferece a liberdade de modificar a implementação a qualquer momento, sem que os clientes sejam obrigados a ajustar o código consequentemente, desde que a interface da estrutura de dados permaneça intocado.
Ocultar os detalhes da implementação da sua estrutura de dados também traz vantagens de segurança, porque se você quiser distribuir sua classe, disponibilizará apenas o arquivo de interface junto com o arquivo de implementação compilado e ninguém saberá se você está realmente usando matrizes ou ponteiros. para sua implementação, protegendo seu aplicativo de algum tipo de exploração ou, pelo menos, de conhecimento devido à impossibilidade de usar ou inspecionar seu código. Além de questões práticas, não subestime o fato de que é uma solução extremamente elegante nesses casos.