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'}

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'}
GO TO FULL VERSION