Primeiros passos com Java IX - Trabalhando com Enums
guilhermegarcia86
Posted on February 21, 2022
Nos artigos anteriores estava sendo abordado o tema do básico de Programação Orientada a Objetos no Java ; porém existem outros tópicos da linguagem que seria bom serem apresentados. Iniciaremos com Enumerações e no final desse artigo você será capaz de entender o que são, como criá-las e usar.
Enumerações foram introduzidas no Java5 e são uma forma dos desenvolvedores trabalharem melhor com dados que não podem ser alterados do que usando constantes , ela foi introduzida como sendo um tipo novo na linguagem o que significa que os desenvolvedores ganharam uma forma de checagem de tipos em tempo de compilação, o que ajuda muito no desenvolvimento principalmente por que possíveis erros são apontados no momento em que estamos escrevendo o código ao invés de só perceber, se perceber, o erro quando o código já está rodando e sendo usado. Juntamente com a tipagem foi adicionado um pacote novo, o java.lang.Enum e com isso uma série de métodos foram herdados quando uma Enum é criada.
Para entender a motivação para adicionar Enums no Java vamos supor que temos um código que valida o dia da semana, sabemos que os nomes dos dias da semana são imutáveis então podemos criar constantes para isso da seguinte forma:
public class DiaDaSemana {
public static final String DOMINGO = "DOMINGO";
public static final String SEGUNDA = "SEGUNDA";
public static final String TERCA = "TERCA";
public static final String QUARTA = "QUARTA";
public static final String QUINTA = "QUINTA";
public static final String SEXTA = "SEXTA";
public static final String SABADO = "SABADO";
}
Tendo em mãos as contantes podemos criar o método que lida com o dia da semana e a partir dele toma alguma decisão:
public static void avaliaDiaDaSemana(String diaDaSemana){
switch (diaDaSemana){
case DiaDaSemana.DOMINGO:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DO DOMINGO");
break;
case DiaDaSemana.SEGUNDA:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA SEGUNDA");
break;
case DiaDaSemana.TERCA:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA TERCA");
break;
case DiaDaSemana.QUARTA:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA QUARTA");
break;
case DiaDaSemana.QUINTA:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA QUINTA");
break;
case DiaDaSemana.SEXTA:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA SEXTA");
break;
case DiaDaSemana.SABADO:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DO SABADO");
break;
}
}
No código acima foi feito uso de um switch-case sem uma cláusula default pois o desenvolvedor assumiu que como esse método sempre vai receber dias da semana não haveria o por que adicionar um default pois não seria executado. Agora vamos simular um caso de uso e testar essa hipótese:
public static void main(String[] args) {
String diaDaSemana = "JANEIRO";
avaliaDiaDaSemana(diaDaSemana);
}
Ao executar esse código nada será impresso pois houve uma falha no dado de entrada e isso não ficou explícito em nenhum ponto do código, uma possível solução aqui seria adicionar o default porém só estaríamos contornando o problema pois esse método permite a entrada de Strings mas no desenvolvimento nós queremos apenas dias da semana como uma entrada válida e se tentassem passar qualquer valor que não seja um dia da semana não poderia ser executado, graças as Enums isso se torna possível.
Criando Enums
Criar uma Enum é como criar uma classe porém utilizamos a palavra reservada enum , para ficar claro o código abaixo é a criação de uma Enum representando os dias da semana:
public enum DiaDaSemana {
DOMINGO,
SEGUNDA,
TERCA,
QUARTA,
QUINTA,
SEXTA
}
Foi criado uma Enum simples e iremos evoluí-la ao passar do artigo e ver outras vantagens que ganhamos com iso. Uma enum carrega consigo um valor que por padrão é o próprio nome do item na Enum , então conseguimos fazer validações do tipo:
System.out.println(DiaDaSemana.valueOf("DOMINGO"));
O método valueOf que vem herdado do pacote java.lang.Enum retorna o item da Enum correspondente se o valor combinar com algum valor da Enum ou lança uma exceção IllegalArgumentException caso não encontre nenhum valor que combine com a String informada, você pode ter notado que bastou adicionar a palavra enum e automaticamente ganhamos vários métodos como o valueOf , name , ordinal e etc.
Usando Enums
Agora vamos alterar o método avaliaDiaDaSemana para trabalhar com a Enum DiaDaSemana :
public static void avaliaDiaDaSemana(DiaDaSemana diaDaSemana){
switch (diaDaSemana){
case DOMINGO:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DO DOMINGO");
break;
case SEGUNDA:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA SEGUNDA");
break;
case TERCA:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA TERCA");
break;
case QUARTA:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA QUARTA");
break;
case QUINTA:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA QUINTA");
break;
case SEXTA:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DA SEXTA");
break;
case SABADO:
System.out.println("EXECUTANDO REGRA DE NEGÓCIO DO SABADO");
break;
}
}
Agora o método recebe a Enum DiaDaSemana e não há como passar outro valor que não seja um DiaDaSemana para o método avaliaDiaDaSemana :
avaliaDiaDaSemana(DiaDaSemana.DOMINGO);
Se tentarmos usar outro tipo que não seja um DiaDaSemana o código não irá compilar e se forçarmos o uso de outro valor será lançada uma Exception :
//Não compila
avaliaDiaDaSemana("OutroValor");
//IllegalArgumentException
avaliaDiaDaSemana(DiaDaSemana.valueOf("DIA QUE NÃO EXISTE"));
Atributos e métodos com Enums
Vimos o exemplo de como criar uma Enum do jeito mais simples possível, porém Enums podem ter atributos e métodos associados a elas. Isso ocorre pois uma Enumeração se comporta como se fosse uma classe estática, uma classe que não pode ser instanciada, então se é uma classe é possível existir atributos e métodos, a própria utilização de uma Enum se assemelha ao uso de um método estático, exemplo: DiaDaSemana.DOMINGO. Por conta disso caso seja necessário ter métodos ou atributos que auxiliem na execução de Enums podemos adicionar da seguinte maneira, começando pelo atributos:
public enum DiaDaSemana {
DOMINGO("Domingo"),
SEGUNDA("Segunda"),
TERCA("Terça"),
QUARTA("Quarta"),
QUINTA("Quinta"),
SEXTA("Sexta"),
SABADO("Sábado");
private String nome;
DiaDaSemana(String nome){
this.nome = nome;
}
}
Como Enums se comportam como classes, com a exceção de que não podem ser instanciadas, podemos criar atributos mas para ligá-los ao itens da Enum DiaDaSemana é necessário que esses itens, da Enum , estejam instanciados dentro da Enum e para isso foi criado um construtor, que não é público, fazendo a ligação do atributo nome para cada item no Enum e por fim foi criado um valor para cada um deles.
Para criar métodos em Enums é o mesmo que criar métodos em classes:
public String getNome(){
return this.nome;
}
A utilização dos métodos é muito parecido com o que vemos em métodos estáticos:
System.out.println(DiaDaSemana.DOMINGO.getNome());
E o resultado é o atributo nome que está associado ao item DOMINGO :
Domingo
Para esclarecer um pouco mais vamos criar outro método para verificar se o dia é final de semana:
public boolean verificaFinalDeSemana(){
if(this == SABADO || this == DOMINGO){
return true;
}
return false;
}
O método acima verifica se o dia testado é um sábado ou domingo e retorna um true caso seja e um false caso não seja, perceba que é passado o operador this e ele se refere a instancia do item do Enum que irá chamar o método verificaFinalDeSemana :
System.out.println(DiaDaSemana.SEGUNDA.verificaFinalDeSemana());
System.out.println(DiaDaSemana.SABADO.verificaFinalDeSemana());
Então quando o Enum DiaDaSemana.SEGUNDA chamar o método verificaFinalDeSemana o this se refere a SEGUNDA e assim em todos os itens da Enum , rodando esse código o resultado é:
false
true
Conclusão
Quando se trabalha com Enum na maioria das vezes é por que existe uma coleção de dados que devem constante e queremos que isso seja garantido, Enums suprem muito bem essa necessidade. Existem outras maneiras de trabalhar com Enums como EnumSet e EnumMap porém esses são tópicos mais avançados de Enums e não tão comumente usados no dia-a-dia, porém com o que foi passado você será capaz de entender quando usar Enums e como usá-las para tirar o máximo proveito possivel delas.
O código deste artigo se encontra no GitHub
Visite também o nosso canal no Youtube para mais acompanhar essa série de Primeiros passos com o Java e muito mais conteúdos sobre programação.
Posted on February 21, 2022
Join Our Newsletter. No Spam, Only the good stuff.
Sign up to receive the latest update from our blog.
Related
November 27, 2024