Blog Formação DEV

Enums em Java: Como Usar e Manipular Enumerações

Enum é um tipo de dado em Java extremamente poderoso para determinar conjuntos fixos de valores nomeados, é um método muito essencial para trabalhar com valores constantes.
Enums em Java: Como Usar e Manipular Enumerações
Texto de: Geraldo Daros

Introdução

A palavra enum é uma abreviação de “enumeração”, e é usada em programação para se referir a um tipo de dado que permite definir um conjunto fixo de valores nomeados. Em Java, um enum é uma classe especial que contém um conjunto fixo de constantes nomeadas. Os enums são úteis para representar um conjunto de valores fixos e bem definidos em um programa, como os dias da semana, os meses do ano ou os códigos de erro.

Definindo enums em Java

Em Java, você pode definir um enum, como se fosse definir uma classe, porém trocando a palavra-chave class por enum. A sintaxe básica para definir um enum é a seguinte:

enum NomeDoEnum {
    ATRIBUTO1, ATRIBUTO2
} 

Por se tratarem de constantes, é uma convenção que os nomes dos atributos de um enum sejam nomeados utilizando apenas letras maiúsculas e o símbolo de underline, nos casos onde o nome do atributo é composto por múltiplas palavras. Embora esse tipo de nomenclatura não tenha nenhum impacto do ponto de vista do funcionamento desse tipo de dados, essa convenção é considerada uma boa prática e é amplamente usada pela comunidade. Aqui está um exemplo simples de enum que define os dias da semana:

enum DiaDaSemana {
    DOMINGO, SEGUNDA, TERCA, QUARTA, QUINTA, SEXTA, SABADO
} 

Manipulando enums em Java

Existem várias maneiras de manipular enums em Java, e algumas delas são listadas abaixo:

  • Acessar atributos de enum: você pode acessar os atributos de enum usando a sintaxe “NomeDoEnum.ATRIBUTO”. Por exemplo, para acessar o atributo “SEGUNDA” do enum DiaDaSemana, você pode usar o seguinte código: DiaDaSemana.SEGUNDA.
  • Comparar atributos de enum: você pode comparar os atributos de enum usando o operador de igualdade do Java ou o método “equals()”. Por exemplo, para verificar se o atributo de um objeto DiaDaSemana é igual à SEGUNDA, você pode usar o seguinte código:
public class TesteEnum {
    public static void main(String[] args) {
        DiaDaSemana hoje = DiaDaSemana.QUARTA;
        if (hoje == DiaDaSemana.SEGUNDA) {
            System.out.println("Hoje é SEGUNDA");
        } else {
            System.out.println("Hoje não é SEGUNDA");
        }
    }
} 
  • Obter todos os atributos de um enum: você pode obter todos os atributos de um enum usando um loop. Por exemplo, para imprimir todos os atributos do enum DiaDaSemana, você pode usar o seguinte código:
public class TesteEnum {
    public static void main(String[] args) {
        for (DiaDaSemana dia : DiaDaSemana.values()) {
            System.out.println(dia);
        }
    }
} 

O resultado desse loop será:

DOMINGO
SEGUNDA
TERCA
QUARTA
QUINTA
SEXTA
SABADO

Os enums também podem ter campos e métodos personalizados. No exemplo abaixo, temos um enum que representa os dias da semana e associando a cada atributo do enum, temos um valor inteiro correspondente. Além dos valores, o enum também conta com um método que permite acessar o valor associado a cada atributo definido no enum.

enum DiaDaSemana {
     DOMINGO(0),
     SEGUNDA(1),
     TERCA(2),
     QUARTA(3),
     QUINTA(4),
     SEXTA(5),
     SABADO(6);

     private final int VALOR;

     DiaDaSemana(int valor) {
          this.VALOR = valor;
     }

     public int getValor() {
          return VALOR;
     }
} 

No exemplo acima, cada atributo do enum tem um valor numérico associado a ele (0 para DOMINGO, 1 para SEGUNDA, etc.). O construtor do enum é usado para definir o valor numérico associado a cada valor de enum e o método “getValor()” retorna o valor numérico associado a cada atributo do enum.

Faremos agora um código que receberá uma String contendo um dia da semana e iremos transformar essa String que recebemos do usuário no atributo equivalente, segundo as definições do enum. Depois, utilizaremos esse valor para imprimir se o dia inserido é um dia de semana, ou não.

import java.util.Scanner;

public class TesteEnum {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Digite o dia da semana (em letras minúsculas): ");
        String input = scanner.nextLine();

        try {
            DiaDaSemana dia = DiaDaSemana.valueOf(input.toUpperCase());

            switch (dia) {
                case SEGUNDA:
                case TERCA:
                case QUARTA:
                case QUINTA:
                case SEXTA:
                    System.out.println("Hoje é dia de trabalho!");
                    break;
                case SABADO:
                case DOMINGO:
                    System.out.println("Hoje é final de semana!");
                    break;
            }
        } catch (IllegalArgumentException e) {
            System.out.println("Dia da semana inválido!");
        }

        scanner.close();

    }
} 

Para verificar o valor do atributo recebido, podemos estruturar o código da seguinte forma:

public class TesteEnum {
    public static void main(String[] args) {
            DiaDaSemana dia = DiaDaSemana.QUARTA;
            System.out.println(dia.getValor());
    }
} 

O retorno desse código será: 3.

Usando enums em Java dentro de classes

Também podemos utilizar os enums em conjunto com a da orientação a objetos. Por exemplo, você podemos usar um enum para representar o tipo de um animal em um programa. Suponhamos que você tenha um sistema de PetShop que trabalha com muitas raças de cachorros, neste caso, você pode ter vários enums com diferentes raças, separando os enums por alguma regra em específico. No exemplo a seguir consideramos que nosso sistema de PetShop tem um sistema de adoção com cachorros que não são originários de locais frios, então, quando o usuário pesquisar uma raça que é nativa de climas frios, irá receber uma mensagem dizendo que essa raça não está disponível para doação.

public enum CachorroRacasFrio {
    MALAMUTE_DO_ALASCA,
    HUSKY_SIBERIANO,
    SAO_BERNARDO,
    SAMOIEDO,
    AKITA_INU,
    BERNESE_MOUNTAIN_DOG,
    NEWFOUNDLAND,
    HAVANESE
} 

Agora vamos usar esse enum, na prática, simulando um sistema de adoção de cães de uma forma bem simples:

import java.util.Scanner;

public class PetShop {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Olá, qual raça de cachorro você gostaria de adotar? :)");
        String racaDesejada = scanner.nextLine().toUpperCase().replace(" ", "_");

        for (CachorroRacasFrio dog : CachorroRacasFrio.values()) {
            if(dog.equals(CachorroRacasFrio.valueOf(racaDesejada))){
                System.out.println("Nós não temos essa raça de cachorro para adotar");
            }
        
        }
    }
} 

Nessa classe o usuário irá digitar a raça de cachorro que ele deseja, então após nós pegarmos esse valor, iremos alterar ele para ficar com todas as letras maiúsculas e depois trocaremos os espaços em branco por um underline. Isso vai fazer com que possa ser comparado com o enum, devido à formatação. Se o usuário digitar "husky siberiano", o sistema transformará o texto para "HUSKY_SIBERIANO".

E só após essa manipulação o valor é comparado com o enum. Então, no exemplo acima, todas às vezes que um usuário digitar uma raça originada de climas frios, ele será avisado que o PetShop não possui essa raça para adoção.

Mas isso tem um problema, precisamos alterar o todo o valor recebido para que assim possamos fazer a real comparação entre os atributos do enum e o valor recebido. O que nós podemos fazer, então, é adicionar alguns valores referentes a essas raças para usarmos como comparação, exemplo de modificação do enun CachorroRacasFrio:

public enum CachorroRacasFrio {
    MALAMUTE_DO_ALASCA("Malamute do Alasca"),
    HUSKY_SIBERIANO("Husky Siberiano"),
    SAO_BERNARDO("São Bernardo"),
    SAMOIEDO("Samoiedo"),
    AKITA_INU("Akita Inu"),
    BERNESE_MOUNTAIN_DOG("Bernese Mountain Dog"),
    NEWFOUNDLAND("Newfoundland"),
    HAVANESE("Havanese");

    private String NOME;

    CachorroRacasFrio(String nome) {
        this.NOME = nome;
    }

    public String getNome() {
        return NOME;
    }
} 

Neste exemplo, cada atributo do enum tem um nome associado a ele. Ao realizar comparações, em vez de comparar diretamente o valor digitado pelo usuário com o enum, comparamos com o nome atribuído ao enum. Em outras palavras, ao invés de verificar se o valor digitado é igual ao atributo do enum, verificamos se é igual ao valor desse atributo. Isso nos permite realizar comparações mais legíveis e entender facilmente a correspondência entre o valor inserido e o atributo correspondente. Segue o exemplo:

import java.util.Scanner;

public class PetShop {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("Olá, qual raça de cachorro você gostaria de adotar? :)");
        String racaDesejada = scanner.nextLine();

        for (CachorroRacasFrio dog : CachorroRacasFrio.values()) {
            if (dog.getNome().equalsIgnoreCase(racaDesejada)) {
                System.out.println("Nós não temos essa raça de cachorro para adotar");
            }

        }
    }
} 

Dessa forma a gente faz a “mesma coisa” só que de uma forma diferente, uma forma mais “limpa” de fazer validações quando usamos o enum.

Conclusão

Em Java, enums são uma maneira poderosa de representar um conjunto fixo de valores nomeados em seu programa. Eles ajudam a garantir que você não acabe com valores inválidos e tornam seu código mais fácil de entender e manter. Dominar o uso de enums é algo essencial para que você consiga desenvolver soluções mais maduras e escaláveis e com certeza você deve dedicar um tempo ao estudo desse conceito.

Sobre o autor
Cod3r

Cod3r

Com mais de 400 mil alunos, a Cod3r é uma das principais escolas de tecnologia do País. Um de seus produtos mais importantes é a Formação DEV, com objetivo de preparar os profissionais para o mercado.

Ótimo! Inscreveu-se com sucesso.

Bem-vindo de volta! Registou-se com sucesso.

Assinou com sucesso o Blog Formação DEV .

Sucesso! Verifique o seu e-mail para obter o link mágico para se inscrever.

As suas informações de pagamento foram atualizadas.

Seu pagamento não foi atualizado.