CodeGym /Blogue Java /Random-PT /Classe Enum em Java
John Squirrels
Nível 41
San Francisco

Classe Enum em Java

Publicado no grupo Random-PT
Oi! Neste artigo vamos falar sobre Java Enums . Imagine que você recebeu a seguinte tarefa: criar uma classe que implemente os dias da semana . À primeira vista, isso parece bastante simples. Seu código ficaria 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 + '\'' +
               '}';
   }
}
Tudo parece estar bem, mas há um problema: você pode passar qualquer texto para o construtor da classe DayOfWeek . Isso significa que alguém pode criar um dia da semana chamado "Frog", "Cloud" ou "azaza322". Este claramente não é o comportamento que esperamos, já que existem apenas 7 dias reais da semana, e cada um deles tem um nome específico. Portanto, nossa tarefa é limitar de alguma forma o intervalo de valores possíveis para a classe DayOfWeek . Antes do surgimento do Java 1.5, os desenvolvedores precisavam inventar de forma independente suas próprias soluções para esse problema, já que a linguagem não tinha uma solução pronta. Naquela época, se os programadores precisassem limitar o número de valores, eles faziam isso:

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 + '\'' +
               '}';
   }
}
Aqui está o que você deve observar:
  • O construtor é privado. Se um construtor estiver marcado com o modificador privado , ele não poderá ser usado para criar um objeto. E como a classe tem apenas um construtor, nenhum objeto DayOfWeek pode ser criado.

    
    	public class Main {
    
       		public static void main(String[] args) {
          
           			DayOfWeek sunday = new DayOfWeek(); // Error!
       		}
    }
    

  • Obviamente, a classe tem o número necessário de objetos estáticos públicos , que foram inicializados corretamente (usando os nomes corretos dos dias da semana).

    Isso permitiu que esses objetos fossem usados ​​em outras classes.

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

    Saída:

    DayOfWeek{title = 'Domingo'}

Essa abordagem resolve em grande parte o problema. Temos 7 dias da semana à nossa disposição e ninguém pode criar novos. Esta solução foi oferecida por Joshua Bloch em seu livro Effective Java . A propósito, esse livro é muito legal e uma leitura obrigatória para qualquer desenvolvedor Java. Como usar a classe Enum - 2Com o lançamento do Java 1.5, a linguagem ganhou uma solução pronta para essas situações: Java Enums . Enum em Java também é uma classe. Ele é especialmente "afinado" para resolver problemas como este, ou seja, criar um certo intervalo limitado de valores. Os criadores de Java já tinham exemplos prontos (por exemplo, C já tinha enum ), então eles conseguiram criar a melhor variante.

Então, o que é Java Enum?

Vamos revisitar nosso exemplo DayOfWeek :

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Agora isso parece muito mais simples :) Internamente, nosso Enum tem 7 constantes estáticas. E isso é algo que podemos usar para implementar um programa. Por exemplo, vamos escrever um programa que determine se um aluno precisa ir à escola hoje. Nosso aluno terá uma programação diária, representada pela classe StudentSchedule :

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
A variável dayOfWeek do objeto de agendamento determina qual dia é hoje. E aqui está nossa classe de alunos:

public class Student {

   private StudentSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {
      
       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep more!");
       } else {
           System.out.println("Damn, time for school again :(");
       }
   }
}
No método wakeUp() , usamos Java Enum para determinar o que o aluno deve fazer a seguir. Nem mesmo fornecemos detalhes sobre cada campo em DayOfWeek , e não precisamos: é óbvio como os dias da semana devem funcionar. Se o usarmos em sua forma atual, qualquer desenvolvedor entenderá o que está acontecendo em nosso código. Outro exemplo da conveniência de Enum é que suas constantes podem ser usadas com a instrução switch. Por exemplo, vamos escrever um programa para uma dieta rigorosa, na qual os pratos são programados por dia:

public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday Dinner! You can even enjoy something a little sweet today.");
               break;
           case MONDAY:
               System.out.println("Lunch for Monday: chicken noodle soup!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today it's celery soup :(");
               break;
               //... and so on to the end
       }
   }
}
Essa é 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 Enum ? Enum é uma classe real com todas as possibilidades que isso implica. Por exemplo, se a implementação atual dos dias da semana for inadequada, 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 + '\'' +
               '}';
   }
}
Agora nossas constantes Enum têm um campo de título , getter e método toString substituído. Em comparação com as classes regulares, uma limitação séria foi colocada no Enum — ele não pode ser herdado. Além disso, as enumerações têm métodos característicos:
  • values() : retorna uma matriz de todos os valores no Enum :

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

    Saída:

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

  • ordinal() : retorna o número ordinal da constante. A numeração começa do zero:

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

    Saída:

    0

  • valueOf() : retorna o objeto Enum que corresponde ao nome passado:

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

    Saída:

    DayOfWeek{title = 'Domingo'}

Observação:usamos letras maiúsculas para especificar os campos Enum . Essas são constantes, então elas usam letras maiúsculas em vez de camelCase .
Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION