Dicas de Uso em enums JAVA
- #Java
Introdução
Os enums são enumerations, um tipo de dado que vai permitir a utilização de valores pré-definidos.
Seu uso é interessante quando se deseja um conjunto fixo e limitado de valores na sua aplicação.
Um exemplo comum que podemos citar é na utilização com meses do ano.
Para criar um enum, na sua forma mais simples:
1) basta utilizar a palavra-chave enum seguido de um nome (seguindo a convenção com a primeira letra em maiúscula + camelCase nas palavras seguintes, caso haja);
2) abrir um bloco de código com os valores fixos (como variáveis constantes, por isso escrever tudo em maiúscula + underscore em_caso de mais uma palavra);
3) dentro de uma classe existente.
public class Exemplo {
enum Mes {
JANEIRO, FEVEREIRO, MARÇO, ABRIL, MAIO, JUNHO, JULHO, AGOSTO, SETEMBRO, OUTUBRO, NOVEMBRO, DEZEMBRO
}
}
OU
public class Exemplo {
enum MesDoAno {
JANEIRO_01, FEVEREIRO_02, MARÇO_03, ABRIL_04, MAIO_05, JUNHO_06, JULHO_07, AGOSTO_08, SETEMBRO_09, OUTUBRO_10, NOVEMBRO_11, DEZEMBRO_12
}
}
Como é um tipo de dados podemos criar variáveis conforme a seguir:
Mes primeiroMes = Mes.JANEIRO;
Mes semMes = null;
Sim é isso mesmo!
O enum não é um tipo primitivo de dado, internamente é como se fosse uma classe por isso pode receber nulo na referência da variável.
Pontos Importantes
Não podemos atribuir tipos primitivos, ou Strings, ou qualquer outra coisa que não seja DE enum PARA enum como os exemplos a seguir:
// não vai funcionar
Mes testeMes = 1;
Mes testeMes1 = “JANEIRO”;
Mes testeMes0 = Mes.ALGUMACOISA;
O enum te ajuda em tempo de compilação, ou seja, acusa aqueles erros sinalizados pela IDE de sua escolha, no desenvolvimento do sistema te dando a certeza dos valores que serão assumidos pela aplicação.
I – Outras formas de criação de enum
É possível criar enums separadamente de uma classe inclusive definindo atributos, métodos e construtores.
Para isso na IDE de sua preferencia localize o caminho de criação de classes e busque pela opção de enum.
Exemplo de atribuição do nome do mês ao seu número, construtor e métodos:
public enum Mes {
JANEIRO (1),
FEVEREIRO (2),
MARÇO (3),
ABRIL (4),
MAIO (5),
JUNHO (6),
JULHO (7),
AGOSTO (8),
SETEMBRO (9),
OUTUBRO (10),
NOVEMBRO (11),
DEZEMBRO (12);
// atributo privado utilizado no construtor
private final int mesNumero;
// construtor que inicializa o valor do atributo final
Mes(int mesNumero) {
this.mesNumero = mesNumero;
}
// método get para obter o valor do atributo
public int getMesNumero() {
return mesNumero;
}
}
Importante: o construtor do enum é privado para evitar que durante a execução da aplicação outros valores sejam criados.
Na nossa classe Exemplo vamos executar a aplicação e obter um valor do enum
public class Exemplo {
public static void main(String[] args) {
Mes mes = Mes.SETEMBRO; // atribui o enum a uma variável
System.out.println(mes.getMesNumero()); // imprimi o numero do mês selecionado
System.out.println(mes); // imprimi o nome do mês selecionado
}
}
Se deu tudo certo o resultado no console será:
9
SETEMBRO
II – Estender não! Implementar sim!
Um enum, por ser final, não pode ser estendido (herança), porém, é possível implementar interfaces e pode ser utilizado em alguns cenários.
Por exemplo, vamos criar uma interface para representar animais de estimação com apenas um método:
public interface AnimalEstimacao {
String falar();
}
Vamos criar uma classe Cachorro para implementar a interface AnimalEstimacao:
public class Cachorro implements AnimalEstimacao {
@Override
public String falar() {
return "Latindo";
}
}
Para o cachorro latir vamos criar uma classe Exemplo2 para rodar a aplicação com um método estático falar para receber o animal de estimação.
public class Exemplo2 {
public static void main(String[] args) {
Cachorro cachorro = new Cachorro();
falar(cachorro);
}
private static void falar(AnimalEstimacao animalEstimacao) {
System.out.println(animalEstimacao.falar());
}
}
E agora, se tenho outros animais de estimação?
Pode seguir o exemplo do cachorro
OU
Poderia apenas criar um enum e implementar o método falar, da interface AnimalEstimacao, para cada um deles:
Por exemplo um enum MeuAnimalEstimacao implementando a interface
public enum MeuAnimalEstimacao implements AnimalEstimacao {
GATO {
@Override
public String falar() {
return "miando";
}
},
RATO;
@Override
public String falar() {
return "chiando";
}
}
Poderia incluir o cachorro e excluir a classe Cachorro, porém, para exemplificar o poder do enum vamos incluir na classe Exemplo2 de execução da aplicação (que contém o método main)
public class Exemplo2 {
public static void main(String[] args) {
Cachorro cachorro = new Cachorro();
falar(cachorro);
falar(MeuAnimalEstimacao.GATO);
falar(MeuAnimalEstimacao.RATO);
}
private static void falar(AnimalEstimacao animalEstimacao) {
System.out.println(animalEstimacao.falar());
}
}
Se deu tudo certo o resultado no console será:
Latindo
miando
chiando
III – Combinar enums com switch expressions
Vamos aproveitar a estrutura utilizada no tópico 1 para construir uma aplicação que identifica quantos dias tem determinado mês do ano.
Para isso vamos combinar os enums com as switch expressions, criadas no Java 14, e que deram mais poder a estrutura switch
No enum Mes, criado anteriormente, vamos adicionar um método para retornar o número de dias do mês escolhido:
public enum Mes {
JANEIRO (1),
FEVEREIRO (2),
MARÇO (3),
ABRIL (4),
MAIO (5),
JUNHO (6),
JULHO (7),
AGOSTO (8),
SETEMBRO (9),
OUTUBRO (10),
NOVEMBRO (11),
DEZEMBRO (12);
private final int mesNumero;
Mes(int mesNumero) {
this.mesNumero = mesNumero;
}
public int getMesNumero() {
return mesNumero;
}
// método para retornar os dias do mês
public int numeroDeDias() {
return switch (this) {
case JANEIRO, MARÇO, MAIO, JULHO, AGOSTO, OUTUBRO, DEZEMBRO -> 31;
case FEVEREIRO -> 28;
case ABRIL, JUNHO, SETEMBRO, NOVEMBRO -> 30;
};
}
}
Agora para finalizar vamos criar uma classe Exemplo3 para executar nossa aplicação no método main:
Nela chamamos o enum com o mês e com o método numeroDeDias.
public class Exemplo3 {
public static void main(String[] args) {
System.out.println(Mes.AGOSTO.numeroDeDias());
System.out.println(Mes.FEVEREIRO.numeroDeDias());
System.out.println(Mes.SETEMBRO.numeroDeDias());
}
}
Se deu tudo certo o resultado no console será:
31
28
30
IV - Conclusão
O enum é um tipo de dado poderoso e combiná-lo com outras estruturas do Java pode te ajudar a alcançar muitos resultados, que inclusive eu também faço parte desse aprendizado constante.
Se você teve dúvidas em algum momento pesquise sobre isso, por exemplo, quando falamos sobre o enum aceitar referências nulas, pode estudar sobre como o Java gerencia a memória disponível (stack / heap) e onde o Enum entra nessa história.
Esse foi meu primeiro artigo, então se algo pode ser melhorado, deixe seu comentário para que possamos crescer juntos!
Fonte da imagem capa: https://br.freepik.com/vetores-gratis/grafico-livre-de-recursos-fundo-abstrato_711895.htm