Funções em Java: Como subir de nível com enum Java
- #Java
Introdução
Quando se estuda funções em Java, ou então pratica com algum projeto Java, acaba se deparando em algum momento com o termo “enum” que muitas vezes está relacionado ao uso e agrupamento de constantes, mas o que é enum? Como enum Java pode contribuir no meu projeto?
Para responder as questões, este artigo traz o conceito e exemplos do básico de enum separando o assunto com a proposta de níveis, aqui vamos até o nível 3.
Nível 0 – Prólogo
O termo “enum” é uma abreviação para enumeração que pode ser entendido como:
“Especificação de coisas uma por uma” (DICIO, 2024).
Com isso dá para ter uma ideia de para que serve o tal “enum”. Conforme JAVA ENUMS de W3Schools (2024), o “enum Java” é uma classe especial que representa um grupo de constantes.
Ter uma classe enum ajuda a organizar o conteúdo estático, as contantes, para coesão e reaproveitamento no projeto. Além de organizar para obter valores pré-definidos, a classe enum Java pode ser utilizada em condições e laços (loops) com tendência em melhorar a legibilidade do código por pessoas, conceito importante para código limpo (clean code).
Aqui vamos tratar os primeiros níveis básicos do enum: como montar a primeira classe enum, usando a classe enum como atributo e em condição, dando corpo e movimento ao enum.
Agora vamos ao primeiro nível ver como é uma classe enum.
Nível 1 – Como montar a primeira classe enum
Uma classe enum Java, como citada anteriormente, é um grupo de constantes, para criar este tipo de classe:
Comece com a palavra-chave enum, dê um nome para a classe seguindo a convenção PascalCase (primeira letra de cada palavra maiúscula sem espaço), abra as chaves e coloque as constantes separadas por vírgula seguindo a convenção SCREAMING_SNAKE_CASE (todas as letras maiúsculas utilizando o underline como espaço entre as palavras), feche as chaves e já terá sua primeira classe enum formada.
O texto anterior parece ser complicado, mas vamos ver agora uma classe enum, vamos utilizar um exemplo básico que representa tipo de pessoa para um cadastro de pessoas, considerando os tipos de pessoa física e pessoa jurídica:
enum TipoPessoa {
FISICA,
JURIDICA
}
Outro exemplo para criar uma classe enum pode ser uma lista de tipos de Telefone para um cadastro de números de telefone:
enum TipoTelefone {
RESIDENCIAL,
COMERCIAL,
CELULAR,
RECADO
}
A vantagem do enum é manter a consistência dos dados já que é imutável, no exemplo do enum TipoPessoa só teremos as opções FISICA e JURIDICA, não há outra opção para tratar ou testar.
Tem-se também o desafio: abstrair a informação para conseguir chegar em um enum não é fácil e normalmente requer prática, uma primeira sugestão é olhar para atributos em classes, será que algum atributo não poderia ser uma lista já predefinida?
O enum como lista pode até fazer um papel semelhante ao que um cache ou tabela de referência em banco de dados fazem, usar o enum em bibliotecas pode ser muito útil para garantir a consistência, facilitar o conhecimento das opções disponíveis fornecidas pela biblioteca e a legibilidade do código e não precisar de nenhuma outra implementação extra como conexão com um cache ou banco de dados.
Como uma lista o enum pode ser utilizado como um atributo de uma classe ou para uma condição, vamos ver isso no nível 2.
Nível 2 – Usando a classe enum como atributo e em condição
Como utilizar, por exemplo, TipoPessoa em um cadastro de pessoas?
Para responder, segue o exemplo abaixo para usar com sua IDE favorita ou um editor/compilador Java online e executar para ver como usar enum em condição e o que ele retorna. (lembre-se que para dar certo a compilação, o nome do arquivo .java tem que ser o mesmo da public class, no caso do exemplo: Main.java)
public class Main {
public static void main(String args[]) {
System.out.println("As pessoas podem ser somente de um dos tipos:");
for (TipoPessoa tipoPessoa : TipoPessoa.values()) {
System.out.println(tipoPessoa);
}
System.out.println("=".repeat(20));
Pessoa pessoa1 = new Pessoa("João", TipoPessoa.FISICA);
Pessoa pessoa2 = new Pessoa("DevsAssociados", TipoPessoa.JURIDICA);
System.out.println("Exemplo pessoa1: " + pessoa1);
System.out.println("Exemplo pessoa2: " + pessoa2);
System.out.println("=".repeat(20));
System.out.println("Condição usando enum");
verificaTipoPessoa(pessoa1);
verificaTipoPessoa(pessoa2);
}
private static void verificaTipoPessoa(Pessoa pessoa) {
if (pessoa.getTipoPessoa() == TipoPessoa.FISICA) {
System.out.println(pessoa.getNome() + " é uma pessoa comum");
} else {
System.out.println(pessoa.getNome() + " é uma empresa");
}
}
}
enum TipoPessoa {
FISICA,
JURIDICA
}
class Pessoa {
private String nome;
private TipoPessoa tipoPessoa;
public Pessoa (String nome, TipoPessoa tipoPessoa) {
this.nome = nome;
this.tipoPessoa = tipoPessoa;
}
public String getNome() {
return this.nome;
}
public TipoPessoa getTipoPessoa() {
return this.tipoPessoa;
}
@Override
public String toString() {
return "Nome: '" + this.nome + "', Tipo de Pessoa: '" + this.tipoPessoa + "'";
}
}
Quando executar a saída deverá ser a seguinte:
As pessoas podem ser somente de um dos tipos:
FISICA
JURIDICA
====================
Exemplo pessoa1: Nome: 'João', Tipo de Pessoa: 'FISICA'
Exemplo pessoa2: Nome: 'DevsAssociados', Tipo de Pessoa: 'JURIDICA'
====================
Condição usando enum
João é uma pessoa comum
DevsAssociados é uma empresa
No exemplo acima é possível visualizar alguns usos com o enum como:
- Laço (for) que percorre todas as opções do enum com o método values()
- Classe que tem um enum como atributo
- Condição que usa enum como parâmetro
Neste nível é possível sentir o uso do enum como uma lista, mas o enum pode fazer mais, agora vamos ao próximo nível ver como dar corpo e movimento ao enum.
Nível 3 – Dando corpo e movimento ao enum
O enum é um tipo de classe, mesmo que especial, e como uma classe é possível também adicionar atributos e métodos, para ver agora um enum com o corpo (atributos) e movimento (métodos) segue o exemplo de JAVA ENUMS (2024) traduzido e adaptado:
public class Main {
public static void main(String[] args) {
double pesoNaTerra = 83.2;
double massa = pesoNaTerra / Planeta.TERRA.gravidadeSuperficie();
for (Planeta p : Planeta.values())
System.out.printf("O seu peso no planeta %s é de %.4fKg%n",
p, p.pesoSuperficie(massa));
}
}
enum Planeta {
MERCURIO (3.303e+23, 2.4397e6),
VENUS (4.869e+24, 6.0518e6),
TERRA (5.976e+24, 6.37814e6),
MARTE (6.421e+23, 3.3972e6),
JUPITER (1.9e+27, 7.1492e7),
SATURNO (5.688e+26, 6.0268e7),
URANO (8.686e+25, 2.5559e7),
NETUNO (1.024e+26, 2.4746e7);
private final double massa; // em kilogramas
private final double raio; // em metros
Planeta(double massa, double raio) {
this.massa = massa;
this.raio = raio;
}
private double massa() { return massa; }
private double raio() { return raio; }
// constante universal da gravidade (m3 kg-1 s-2)
public static final double G = 6.67300E-11;
double gravidadeSuperficie() {
return G * massa / (raio * raio);
}
double pesoSuperficie(double outraMassa) {
return outraMassa * gravidadeSuperficie();
}
}
O resultado da execução do exemplo deve ser:
O seu peso no planeta MERCURIO é de 31.4294Kg
O seu peso no planeta VENUS é de 75.2959Kg
O seu peso no planeta TERRA é de 83.2000Kg
O seu peso no planeta MARTE é de 31.5109Kg
O seu peso no planeta JUPITER é de 210.5424Kg
O seu peso no planeta SATURNO é de 88.6925Kg
O seu peso no planeta URANO é de 75.3066Kg
O seu peso no planeta NETUNO é de 94.7089Kg
Aproveite para editar o código para ver como seria o seu peso nos planetas.
Como podem ver no exemplo acima, a sintaxe do enum muda quando ele tem atributos e métodos: em cada constante agora são adicionados os valores dos atributos entre os parênteses, as contantes continuam separadas por vírgula, mas na última constante tem que usar o famoso “;” e a declaração de atributos e métodos surgiram.
Depois de saber que nos enums dá para colocar atributos e métodos já pensou em alguma situação que isso pode te ajudar?
Conclusão
Retomando as questões da introdução, vamos ver o que temos podemos responder
O que é enum?
Nos níveis 0 e 1, “Prólogo” e 1 “Como montar a primeira classe enum”, tem-se o conceito e a sintaxe de um enum Java básico, um resumo do que é um enum Java
Como enum Java pode contribuir no meu projeto?
Nos níveis 2 e 3, “Usando a classe enum como atributo e em condição” e “Dando corpo e movimento ao enum”, já se tem exemplos práticos de possibilidades para auxiliar na visualização do que o enum pode proporcional para coesão e legibilidade do código. O desafio próprio de cada projeto é conseguir abstrair para o aproveitamento de atributos e métodos com as constantes.
As vezes por associar enum apenas com constantes, ou como uma lista delas, pode acabar subestimando a utilidade no projeto. A ideia é que conhecendo as possibilidades você possa adaptar e aprimorá-las em seus projetos, um dos efeitos é que aproveitando de enums, além de poder estar melhorando a qualidade de código, também pode propiciar facilidade quando criar os testes unitários.
O nível 3 não é o último, este é apenas o começo, os enums podem fazer mais como utilizar as implementações EnumSet e EnumMap e implementar Design Patterns como Singleton Pattern, Strategy Pattern e Chain of Responsibility Pattern.
E você já usou o enum e achou interessante?
Conte sua experiência, sugestões de caso de uso ou exemplos nos comentários.
Achou legal e útil? Deixe seu upvote :)
Referências
AKEMI, Alice. In: Convenções de nomenclatura: Camel, Pascal, Kebab e Snake case. Alura. Disponível em: https://www.alura.com.br/artigos/convencoes-nomenclatura-camel-pascal-kebab-snake-case. Acesso em 07 fev. 2024.
A GUIDE TO JAVA ENUMS. In: Baeldung, 05 jan. 2024. Disponível em: https://www.baeldung.com/a-guide-to-java-enums. Acesso em 07 fev. 2024.
ENUMERAÇÃO. In: DICIO: Dicionário Online de Português. 7GRAUS, © 2009 - 2024. Disponível em: https://www.dicio.com.br/enumeracao/. Acesso em: 06 fev. 2024.
ENUM TYPES. In: Java Documentation, Oracle, © 1995 - 2022. Disponível em: https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html. Acesso em: 07 fev. 2024.
JAVA ENUMS. In: W3Schools. W3-CSS, © 1999 - 2024. Disponível em: https://www.w3schools.com/java/java_enums.asp. Acesso em: 06 fev. 2024.
ONLINE JAVA COMPILER IDE. In: JDoodle. Disponível em: https://www.jdoodle.com/online-java-compiler-ide/. Acesso em: 07 fev. 2024.
REFATORAÇÃO E PADRÕES DE PROJETO. In: Refactoring.Guru, © 2014 - 2024. Disponível em: https://refactoring.guru/pt-br. Acesso em: 07 fev. 2024.
#FunçõesEmJava #enumJava