1. Introdução

Queremos dedicar a lição de hoje ao encapsulamento . Você já sabe o que é em termos gerais.

Encapsulamento

Quais são os benefícios do encapsulamento? São vários, mas posso destacar quatro que, na minha opinião, são os principais:


2. Estado interno válido

Em programas, muitas vezes surgem situações em que um objeto interage com várias outras classes. Essas interações com o objeto podem corromper os dados dentro do objeto, impossibilitando que o objeto continue funcionando conforme o esperado.

Como resultado, o objeto precisa acompanhar quaisquer alterações em seus dados internos ou, melhor ainda, fazer as alterações por conta própria.

Se não queremos que alguma variável seja alterada por outras classes, então a declaramos privada. Uma vez feito isso, apenas os métodos de sua própria classe podem acessá-lo. Se quisermos que as variáveis ​​sejam somente leitura, precisamos adicionar um public getterpara as variáveis ​​relevantes.

Por exemplo, suponha que queremos que todos saibam o número de elementos em nossa coleção, mas não queremos que eles possam alterar a coleção sem nossa permissão. Em seguida, declaramos uma private int countvariável e um public getCount()método.

O uso adequado do encapsulamento garante que nenhuma classe possa acessar diretamente os dados internos de nossa classe, o que, portanto, evita qualquer alteração fora de nosso controle. Essas alterações só são possíveis chamando os métodos da mesma classe das variáveis ​​que estão sendo alteradas.

É melhor presumir que outros programadores sempre usarão suas classes da maneira mais conveniente para eles, não da maneira mais segura para você (para sua classe). Esse comportamento é a fonte de ambos os erros, bem como as tentativas de evitá-los.


3. Validando os argumentos do método

Às vezes precisamos validar os argumentos passados ​​para nossos métodos. Por exemplo, digamos que temos uma classe que representa uma pessoa e permite definir uma data de nascimento. Devemos verificar todos os dados de entrada para garantir que façam sentido com a lógica do programa e a lógica da nossa classe. Por exemplo, para não permitir uma data de nascimento no 13º mês ou em 30 de fevereiro e assim por diante.

Por que alguém indicaria 30 de fevereiro como data de nascimento? Primeiro, isso pode ser um erro do usuário ao inserir os dados. Em segundo lugar, um programa pode conter muitos erros antes de começar a funcionar como um relógio. Por exemplo, a seguinte situação é possível.

Um programador escreve um programa que identifica pessoas cujo aniversário é depois de amanhã. Por exemplo, digamos que hoje seja 3 de março. O programa adiciona o número 2 ao dia atual do mês e procura todos os que nasceram em 5 de março. Parece que está tudo correto.

Mas quando chegar o dia 30 de março, o programa não encontrará ninguém, porque o calendário não tem 32 de março. Um programa tem muito menos erros se verificarmos os dados passados ​​para os métodos.

Lembra quando estudamos ArrayListe analisamos seu código? Vimos que os métodos gete setverificavam se indexé maior ou igual a zero e menor que o comprimento do array. Além do mais, esses métodos lançam uma exceção se o índice estiver fora dos limites da matriz. Este é um exemplo clássico de validação de entrada.


4. Minimizando erros ao alterar o código

Suponha que escrevemos uma classe super útil quando estávamos envolvidos em um grande projeto. Todos gostaram tanto que outros programadores começaram a usá-lo em centenas de lugares em seus códigos.

A aula foi tão útil que você decidiu fazer algumas melhorias. Mas se você remover qualquer método da classe, o código de dezenas de pessoas parará de compilar. Eles terão que reescrever tudo. E quanto mais mudanças você fizer, mais erros você criará. Você quebrará muitas assembléias e será odiado.

Mas quando alteramos os métodos declarados como privados, sabemos que não há uma única outra classe em qualquer lugar que possa estar chamando esses métodos. Podemos reescrevê-los, alterar o número de parâmetros e seus tipos e qualquer código externo dependente continuará funcionando. Bem, pelo menos ele irá compilar.


5. Decidimos como nosso objeto interage com objetos externos

Podemos restringir algumas das ações que podem ser executadas com nosso objeto. Por exemplo, suponha que queremos que um objeto seja instanciado apenas uma vez. Mesmo que possa ser criado em vários locais do projeto. E podemos fazer isso graças ao encapsulamento.

Encapsulamento 2

O encapsulamento nos permite adicionar restrições adicionais , que podem ser transformadas em vantagens adicionais . Por exemplo, a Stringclasse é implementada como um objeto imutável . Um objeto da Stringclasse é imutável desde o momento de sua criação até o momento de sua morte. Todos os métodos da Stringclasse ( remove, substring, ...), retornam uma nova string sem fazer nenhuma alteração no objeto no qual são chamados.

O encapsulamento é uma coisa muito interessante.