JavaRush /Blogue Java /Random-PT /Enum em Java: como usar a classe

Enum em Java: como usar a classe

Publicado no grupo Random-PT
Olá! Neste artigo vou falar sobre Java Enums. Imagine que você recebeu uma tarefa: criar uma classe que implemente os dias da semana . À primeira vista, não há nada de complicado nisso, e seu código será mais ou menos assim:
public class DayOfWeek {

   private String title;

   public DayOfWeek(String title) {
       this.title = title;
   }

   public static void main(String[] args) {
       DayOfWeek dayOfWeek = new DayOfWeek("Saturday");
       System.out.println(dayOfWeek);
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
E tudo parece estar bem, mas há um problema: você pode passar qualquer texto para o construtor da classe DayOfWeek . Desta forma, alguém pode criar o dia da semana “Frog”, “Cloud” ou “azaza322”. Claramente este não é o comportamento que esperamos, porque existem apenas 7 dias reais da semana, e cada um deles tem um nome. Portanto, nossa tarefa é limitar de alguma forma o intervalo de valores possíveis para a classe “ dia da semana ”. Antes do Java 1.5, os desenvolvedores eram forçados a encontrar uma solução para esse problema por conta própria, já que não havia uma solução pronta na própria linguagem. Naquela época, se a situação exigisse um número limitado de valores, eles faziam o seguinte:
public class DayOfWeek {

   private String title;

   private DayOfWeek(String title) {
       this.title = title;
   }

   public static DayOfWeek SUNDAY = new DayOfWeek("Sunday");
   public static DayOfWeek MONDAY = new DayOfWeek("Monday");
   public static DayOfWeek TUESDAY = new DayOfWeek("Tuesday");
   public static DayOfWeek WEDNESDAY = new DayOfWeek("Wednesday");
   public static DayOfWeek THURSDAY = new DayOfWeek("Thursday");
   public static DayOfWeek FRIDAY = new DayOfWeek("Friday");
   public static DayOfWeek SATURDAY = new DayOfWeek("Saturday");

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
O que você deve prestar atenção aqui:
  • Construtor privado. Se um construtor estiver marcado com o modificador private , um objeto da classe não poderá ser criado usando esse construtor. E como existe apenas um construtor nesta classe, o objeto DayOfWeek não pode ser criado.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//error!
       		}
    }
  • Ao mesmo tempo, a classe continha o número necessário de objetos estáticos públicos que foram inicializados da maneira que precisávamos (os nomes dos dias estão corretos).

    Isso possibilitou o uso de objetos em outras classes.

    public class Man {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }

    Conclusão:

    DayOfWeek{title='Domingo'}

Essa abordagem nos permitiu em grande parte resolver o problema. Tínhamos 7 dias da semana à nossa disposição e ninguém conseguia criar novos. Esta solução foi proposta por Joshua Bloch no livro Effective Java . O livro, aliás, é muito legal e leitura obrigatória para qualquer desenvolvedor Java.
Como usar a classe Enum - 2
Com o lançamento do Java 1.5, a linguagem introduziu uma solução pronta para tais situações - a enumeração Enum . Enum também é uma classe. Mas é especialmente “adaptado” para resolver problemas semelhantes aos nossos: a criação de uma certa gama limitada de valores. Como os criadores do Java já tinham exemplos prontos (digamos, a linguagem C, na qual o Enum já existia), eles conseguiram criar a opção ideal.

O que é enum?

Então, o que é Enum em Java ? Vejamos o exemplo do mesmo DayOfWeek :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Já parece bem mais simples :) Dentro do nosso Enum existem 7 constantes com acesso estático. Já podemos usá-lo para implementar lógica no programa. Por exemplo, vamos escrever um programa que determine se um aluno precisa ir à escola hoje. Nosso aluno terá sua própria rotina diária, designada pela classe ScholarSchedule :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
A variável dayOfWeek no modo dia determina que dia é hoje. E aqui está a aula do nosso aluno:
public class Scholar {

   private ScholarSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {

       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep some more!");
       } else {
           System.out.println("Damn, back to school :(");
       }
   }
}
No método wakeUp() , usando Enum, determinamos as ações futuras do aluno. Nem descrevemos detalhadamente o que significa cada variável em DayOfWeek , e isso não é necessário: o mecanismo dos dias da semana já é óbvio, e se o usarmos em sua forma atual, qualquer desenvolvedor entenderá o que está acontecendo no seu código. Outro exemplo da conveniência do Enum é que suas constantes podem ser usadas com uma instrução switch . Por exemplo, estamos escrevendo um programa de dieta rigorosa, em que as refeições são programadas por dia:
public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday lunch! Today you can even have a little sweet");
               break;
           case MONDAY:
               System.out.println("Monday Lunch: Chicken Noodles!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today is celery soup :(");
               break;
               //...and so on until the end
       }
   }
}
Esta é uma das vantagens do Enum sobre a solução antiga usada antes do Java 1.5: a solução antiga não podia ser usada com switch .

O que mais você precisa saber sobre a classe Enum?

A classe Enum é uma classe real com todos os recursos que a acompanham. Por exemplo, se a implementação atual dos dias da semana não for suficiente para você, você pode adicionar variáveis, construtores e métodos a DayOfWeek :
public enum DayOfWeek {

   SUNDAY ("Sunday"),
   MONDAY ("Monday"),
   TUESDAY ("Tuesday"),
   WEDNESDAY ("Wednesday"),
   THURSDAY ("Thursday"),
   FRIDAY ("Friday"),
   SATURDAY ("Saturday");

   private String title;

   DayOfWeek(String title) {
       this.title = title;
   }

   public String getTitle() {
       return title;
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
As constantes do nosso Enum agora têm um campo de título , um getter e um método toString substituído . Comparado às classes regulares, Enum tem uma limitação séria: não pode ser herdado. Além disso, as enumerações possuem métodos exclusivos:
  • valores() : retorna um array de todos os valores armazenados no Enum :

    public static void main(String[] args) {
       		System.out.println(Arrays.toString(DayOfWeek.values()));
    }

    Conclusão:

    [DayOfWeek{title='Domingo'}, DayOfWeek{title='Segunda-feira'}, DayOfWeek{title='Terça-feira'}, DayOfWeek{title='Quarta-feira'}, DayOfWeek{title='Quinta-feira'}, DayOfWeek{title= 'Sexta-feira'}, DayOfWeek{title='Sábado'}]

  • ordinal() : retorna o número ordinal de uma constante. A contagem regressiva começa do zero:

    public static void main(String[] args) {
    
       		int sundayIndex = DayOfWeek.SUNDAY.ordinal();
       		System.out.println(sundayIndex);
    }

    Conclusão:

    0

  • valueOf() : Retorna um objeto Enum correspondente ao nome fornecido:

    public static void main(String[] args) {
       DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY");
       System.out.println(sunday);
    }

    Conclusão:

    DayOfWeek{title='Domingo'}

Prestar atenção:Colocamos os nomes dos elementos Enum em maiúscula porque eles são constantes e são designados como constantes, não camelCase .
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION