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