Enviar um café pro programador

Pode me ajudar a transformar cafeína em código?

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);
        

    }


12 comentários:

Anônimo disse...

Bem simples e recomendo!

Anônimo 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;
}
}

Unknown 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! :)

Maxwell Aguiar Silva disse...

Por favor preciso de um ajuda urgente.
maxwellaguiarsilva@gmail.com

Como eu simulo herança de constantes em java.
I{a, b, c}
J extends I {a, b, c, d, e}

RenanDuarte 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?

Unknown disse...

Na verdade pode sim amigo ser usado valores float desde que seja feito o casting adequadamente, o Java reconhece números com pontos flutuantes automaticamente como double, então para que seja reconhecido como float devemos adicionar um "f" ao umero.
Ex: cocacola(2.00f),
suco(1.50f)....

Anônimo disse...

Achei bem interessante. Podemos usar algo semelhante para impostos:

Imposto.Iss.GetPercentual()...
Imposto.Pis.GetPercentual()

Unknown disse...

Gostaria de poder ter alguma material sobre utilizar enum com mais funções do simplesmente uma constante simples não ferisse a coesão porque por exemplo varios padrões de projeto ficariam muito mais simples aplicando colocando um o enum com um atributo de interface que provem um novo objeto facilmente podendo alterar lógicas e regras facilmente mais parece que isso não está correto...

Wanessa disse...

Esse curso é o melhor, sério!!!!

Contribuir com o Java Progressivo

Que tal apoiar e fazer crescer o ensino da programação no Brasil ?

Ajudar nosso país a crescer e se desenvolver cada vez mais, tecnologicamente?

Clica abaixo pra saber mais!

Apoiar o Projeto Progressivo


Tutoriais de Java