enum: A melhor maneira para manusear constantes

Conforme vimos no tutorial de Java da aula passada, o uso de constantes em suas aplicações é de vital importância pra reusabilidade e legibilidade do código.

O uso de constantes em Java é tão, mas tão importante que a linguagem possui uma ferramenta especial para você manusear - com muita facilidade - suas constantes: o enum

O que é enum em Java


enum nada mais são que um recurso, muito útil e parecido com Orientação a Objetos, feito para tratar, guardar e usar com facilidade suas constantes.

Embora sejam do tipo referência, possuam construtores, declaração e uso parecido com Objetos/Classes, não são. Mas se parecem, por isso vamos apresentar os enum nesta seção de nossa apostila online de Java.

De uma maneira simplificada, você pode ver enum como uma 'classe' especial para tratar constantes.
Você notará melhor isso na sintaxe de declaração e criação do código das enums.


Declarando uma enum em Java

Você pode declarar uma enum da seguinte maneira:

public enum nome_da_enum{

//código de sua enum
}

Por exemplo:

public enum Bebidas{
CocaCola, Suco, Agua;
}

Obviamente, essas constantes não servem de nada, pois não atribuímos nada a elas.
De antemão, você pode ver cada uma dessas constantes como um, digamos, 'objeto' da 'classe' enum.


Usando enum em Java

Vamos adicionar algumas funcionalidades a essa enum, como o preço de cada bebida:

public enum Bebida{

CocaCola(2.00),
Suco(1.50),
Agua(1.00);

private double preco;

Bebida(double preco){
this.preco = preco;
}

public double getPreco(){
return this.preco;
}
}


Primeiro declaramos nossas constantes: CocaCola, Suco e Agua.
Note que inicializamos ela com um double, pois criamos um método construtor que recebe um double: Bebidas(double preco) {...}

Tudo bem parecido com Classes/Objetos, inclusive temos que definir uma variável interna, a 'preco'.

Para invocar um método fazemos: nome_do_enum.nomeDaConstante.metodo()
Por exemplo, para saber quanto custa uma Agua: Bebida.Agua.getPreco();

Notes nomes: Bebida, Agua, getPreco.
Note mesmo, como fica óbvio. Você não precisa se preocupar com o valor numérico,e sim com o nome.
Nesse caso, o nome é bem fácil lembrar, pois usamos palavras óbvias.


Exemplo de uso de enum em Java


Exercício: Aplicativo para Lanchonete
O seguinte aplicativo exibe um menu de uma lanchonete, com 3 tipos de comida e 3 tipos de bebida.
O cliente escolhe o que quer comer e o programa retorna o valor total da conta.

Para tal criamos duas enums: 'Bebida' e 'Comida'.
Cada uma dessas enums recebe dois valores: seu nome (String nome) e seu preço (double preco).
Além disso, as enum tem método construtor, variáveis privadas e métodos que retorna o nome e preço do produto.

Também criamos o método 'menu()', que simplesmente exibe o cardápio.

Através do objeto 'entrada', da classe Scanner, perguntamos a opção desejada ao cliente, e enviamos essa informação para o método 'preco()', que retorna o valor do ítem pedido pelo cliente.
Quando terminar de pedir, ele deve digitar '0' e a aplicação se encerrará.

EnumTest.java
import java.util.Scanner;

public class EnumTest {
    
    public enum Bebida{
        
        CocaCola("Coca-cola", 2.00),
        Suco("Suco", 1.50),
        Agua("Agua", 1.00);

        private double preco;
        private String nome;
        
        Bebida(String nome, double preco){
            this.nome = nome;
            this.preco = preco;
        }

        public double getPreco(){
            return this.preco;
        }
        
        public String getNome(){
            return this.nome;
        }
    }
    
    public enum Comida{
        Sanduiche("Sanduiche", 4.0),
        HotDog("HotDog", 3.0),
        Xburger("X-Burger", 3.5);
        
        private double preco;
        private String nome;
        
        Comida(String nome, double preco){
            this.nome = nome;
            this.preco = preco;
        }
        
        public double getPreco(){
            return this.preco;
        }
        
        public String getNome(){
            return this.nome;
        }
    }
    
    public static void menu(){
        System.out.println("\tBebidas");
        System.out.println("1." + Bebida.CocaCola.getNome() + ": R$" + Bebida.CocaCola.getPreco());
        System.out.println("2." + Bebida.Suco.getNome() + ": R$" + Bebida.Suco.getPreco());
        System.out.println("3." + Bebida.Agua.getNome() + ": R$" + Bebida.Agua.getPreco());
        
        System.out.println("\tComidas");
        System.out.println("4." + Comida.Sanduiche.getNome() + ": R$" + Comida.Sanduiche.getPreco());
        System.out.println("5." + Comida.HotDog.getNome() + ": R$" + Comida.HotDog.getPreco());
        System.out.println("6." + Comida.Xburger.getNome() + ": R$" + Comida.Xburger.getPreco());
        
        System.out.println("0. Sair");
        System.out.print("Escolha sua opção: ");
    }
    
    public static double preco(int opcao){
        switch( opcao ){
            case 1:
                return Bebida.CocaCola.getPreco();
            case 2:
                return Bebida.Suco.getPreco();
            case 3:
                return Bebida.Agua.getPreco();
            case 4:
                return Comida.Sanduiche.getPreco();
            case 5:
                return Comida.HotDog.getPreco();
            case 6:
                return Comida.Xburger.getPreco();
            default:
                return 0.0;
        
        }
    }
    public static void main(String[] args) {
        double total=0.0;
        int opcao=0;
        Scanner entrada = new Scanner(System.in);
        
        do{
            menu();
            opcao = entrada.nextInt();
            total += preco(opcao);
            
            System.out.println("Opção escolhida: " + opcao);
            System.out.println("Valor de sua conta: " + total + "\n");
            
        }while(opcao != 0);
        

    }


7 comentários:

Anônimo disse...

Bem simples e recomendo!

Charles disse...

Considero uma boa prática em Enum, deixar os campos final e o Construtor private.
É muito importante ressaltar isso pra que lê esse texto, pois já vi muita gente criando enum com get/set e construtor público, ai ele não serve para nada. OK?
obrigado.



public enum Bebida{

CocaCola(2.00),
Suco(1.50),
Agua(1.00);

private final double preco;

private Bebida(double preco){
this.preco = preco;
}

public double getPreco(){
return this.preco;
}
}

Tarcisio Allyson disse...

Se eu vou acessar o método para pegar o preço e nome dentro da mesma classe, qual seria a necessidade de usar o get?

oculos disse...

Muito obrigado! Finalmente passei a entender o enum! :)

Renan Leviathan disse...

E um fato interressante é que se vc colocar só o nome da constante do enum, o que aparece é o nome dela como string!

Anônimo disse...

Devo ter algum defite pq tudo o q tento aprender n consigo por em pratica e como perca de tempo de que vale voce tenta aprender algo se n pode por em pratica tudo aquilo o q foi visto :(

Anônimo disse...

Um fato interessante é que se tentarmos declarar p preco como float, aparece um erro falando que não foi identificado um contrutor definindo um double para o enum.

Aparentemente ele só funciona com double e não com float?

Dicas e Novidades de Java por e-mail

Sabe quanto custa um bom livro de java?
Entre R$ 100,00 e R$300,00

Sabe quanto custa um bom curso presencial de Java?
Entre R$ 1.500,00 até R$ 4.000,00

Sabe quanto custa estudar pelo Java Progressivo?
Absolutamente nada.

Porém, também precisamos de sua ajuda e apoio.
Para isso, basta curtir nossa Fan Page e clicar no botão G+ do Google.