O encapsulamento está definindo corretamente o acesso aos membros de um objeto e protegendo o estado interno do objeto.
A primeira parte, definindo o acesso, é feita através dos especificadores de acesso ( public
, private
, protected
e assim por diante). Normalmente, uma classe bem encapsulada limita o acesso tanto quanto possível. Se apenas a classe atual (ou uma instância dessa classe) precisar de acesso a ela, torne-a privada. Se as subclasses também precisarem de acesso, então é um membro protegido. Note que isso se aplica igualmente a variáveis e métodos.
A segunda parte é para proteger o estado interno do objeto de nunca ser inválido. Esse é um dos fatores que impulsionam os métodos de acesso e de mutação. Você pode usar esses métodos para sempre garantir a validade do estado do objeto. Por exemplo, se você tiver uma variável de membro que só pode conter valores específicos, poderá validar antes de alterar o estado do objeto, se precisar do uso de métodos de mutação, mas não puder com uma variável pública.