1. Introdução
Queremos dedicar a lição de hoje ao encapsulamento . Você já sabe o que é em termos gerais.
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 getter
para 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 count
variá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 ArrayList
e analisamos seu código? Vimos que os métodos get
e set
verificavam 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.
O encapsulamento nos permite adicionar restrições adicionais , que podem ser transformadas em vantagens adicionais . Por exemplo, a String
classe é implementada como um objeto imutável . Um objeto da String
classe é imutável desde o momento de sua criação até o momento de sua morte. Todos os métodos da String
classe ( remove
, substring
, ...), retornam uma nova string sem fazer nenhuma alteração no objeto no qual são chamados.
O encapsulamento é uma coisa muito interessante.
GO TO FULL VERSION