O que é Encapsulamento? É util?

Publicado: 1 de abril de 2010 em Nice Taste
Tags:, , , , , , , , , , , ,

Existe muita gente que começa e não entende o que é, e quando entende como usá-lo não entende o por que de usá-lo, dentro da computação os professores sempre tentam ser muito teóricos, eu discordo em alguns pontos, muitas vezes ficam tanto tempo na teoria que não sobra tempo para prática, que leva a entender a motivação de usar isso.

Nos exemplos que vou demonstrar vai ficar bem visível para que serve o encapsulamento dos dados.

Encapsulamento é como se você cria-se um “firewall” nos seus dados para que os mesmos só sejam alterados de acordo com a sua vontade, ou seja só poderá entrar dados que condizem com as regras da classe e de forma indireta, ou seja, não alterando o atributo diretamente.

Com o encapsulamento temos 2 vantagens principais, a primeira que é o controle do dados de entrada e de saída, o segundo que é até mais importante, a centralização das regras de controle.

Imaginem agora um sistema complexo que não use encapsulamento, chega um momento no projeto que existe a necessidade de que um atributo de uma determinada classe que é largamente utilizada, tenha restrições em 1 atributo, será necessário que todo o sistema tenha regras de controle espalhadas por ele de forma que o acoplamento vai ficar “absurdo” e o código nem se fala, se fosse encapsulado seria simplesmente criada uma regra dentro do “setXXX()”, com isso o implementador responsável e os envolvidos seriam absolutamente mais felizes.

Segue um código exemplificando o que eu falei de forma que a classe está encapsulada (gets e sets) e exemplificando algumas regras nos setters.

Funcionario.java

import java.util.HashSet;
import java.util.Set;

public class Funcionario {

 private String    nome;
 private Double    salario;
 private String    flSexo;

 public static final String FL_SEXO_FEMININO = "F";
 public static final String FL_SEXO_MASCULINO = "M";

 public Funcionario() {
 }

    public Funcionario(String nome, Double salario, String flSexo) throws SalarioInvalido, SexoInvalido {
        super();
        setNome(nome);
        setSalario(salario);
        setFlSexo(flSexo);
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public Double getSalario() {
        return salario;
    }

    public void setSalario(Double salario) throws SalarioInvalido {
        if(salario < 0) {
            throw new SalarioInvalido(salario);
        }
        this.salario = salario;
    }

    public String getFlSexo() {
        return flSexo;
    }

    public void setFlSexo(String flSexo) throws SexoInvalido {
        if(FL_SEXO_FEMININO.equals(flSexo) || FL_SEXO_MASCULINO.equals(flSexo)) {
            this.flSexo = flSexo;
        } else {
            throw new SexoInvalido(flSexo);
        }
    }

    public static void main(String[] args) throws SalarioInvalido, SexoInvalido {
        Set<Funcionario> funcionarios = new HashSet<Funcionario>();
        //Dados corretos...
        funcionarios.add(new Funcionario("Augusto Ferreira", 750d, FL_SEXO_MASCULINO));
        funcionarios.add(new Funcionario("Luciana Menezes", 2500d, FL_SEXO_FEMININO));
      
        //Mas se vêm um cabeça e resolve colocar dados errados de alguma maneira?
        funcionarios.add(new Funcionario("José dos Santos", -500d, FL_SEXO_MASCULINO));
        funcionarios.add(new Funcionario("Péricles Chamusca", 6000d, "MASCULINO"));
    }
}

SalarioInvalido.java

public class SalarioInvalido extends Exception {
    public SalarioInvalido(Double salario) {
        super("Salário é inválido: " + salario);
    }
}

SexoInvalido.java

public class SexoInvalido extends Exception {
    public SexoInvalido(String flSexo) {
        super("Sexo informado é inválido: " + flSexo);
    }
}

Código acima demonstra bem como fazer esse “firewall” com encapsulamento.

:), o que acham?

About these ads
Comentários
  1. [...] O que é Encapsulamento? É util? abril, 2010 3 [...]

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s