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 + '\'' +
'}';
}
}
Her şey yolunda görünüyor, ancak bir sorun var: DayOfWeek sınıfının yapıcısına herhangi bir metin iletebilirsiniz . Bu, birisinin haftanın "Kurbağa", "Bulut" veya "azaza322" adlı bir gününü oluşturabileceği anlamına gelir. Haftanın yalnızca 7 gerçek günü olduğundan ve her birinin belirli bir adı olduğundan, bu açıkça beklediğimiz davranış değildir. Bu nedenle, görevimiz DayOfWeek sınıfı için olası değer aralığını bir şekilde sınırlamaktır. Java 1.5 ortaya çıkmadan önce, dilin hazır bir çözümü olmadığından, geliştiricilerin bu soruna bağımsız olarak kendi çözümlerini icat etmeleri gerekiyordu. O günlerde, programcıların değer sayısını sınırlamaları gerekiyorsa, bunu yapıyorlardı:
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 + '\'' +
'}';
}
}
İşte dikkat etmeniz gerekenler:
-
Yapıcı özeldir. Bir yapıcı özel değiştirici ile işaretlenmişse , bir nesne yaratmak için kullanılamaz. Ve sınıfın yalnızca bir yapıcısı olduğundan, hiçbir DayOfWeek nesnesi oluşturulamaz.
public class Main { public static void main(String[] args) { DayOfWeek sunday = new DayOfWeek(); // Error! } }
-
Tabii ki, sınıf , doğru şekilde başlatılan (haftanın günlerinin doğru adlarını kullanarak) gerekli sayıda genel statik nesneye sahiptir .
Bu, bu nesnelerin diğer sınıflarda kullanılmasına izin verdi.
public class Person { public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.SUNDAY; System.out.println(sunday); } }
Çıktı:
DayOfWeek{title = 'Pazar'}

Peki Java Enum nedir?
DayOfWeek örneğimizi tekrar gözden geçirelim :
public enum DayOfWeek {
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
}
Şimdi bu çok daha basit görünüyor :) Dahili olarak, Enum'umuz 7 statik sabite sahiptir. Ve bu, bir programı uygulamak için kullanabileceğimiz bir şey. Örneğin bugün bir öğrencinin okula gitmesi gerekip gerekmediğini belirleyen bir program yazalım. Öğrencimizin, StudentSchedule sınıfı tarafından temsil edilen günlük bir programı olacaktır:
public class StudentSchedule {
private DayOfWeek dayOfWeek;
// ... other fields
public DayOfWeek getDayOfWeek() {
return dayOfWeek;
}
public void setDayOfWeek(DayOfWeek dayOfWeek) {
this.dayOfWeek = dayOfWeek;
}
}
Zamanlama nesnesinin dayOfWeek değişkeni bugünün hangi gün olduğunu belirler. Ve işte öğrenci sınıfımız:
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 :(");
}
}
}
WakeUp() yönteminde , öğrencinin bundan sonra ne yapması gerektiğini belirlemek için Java Enum'u kullanırız . DayOfWeek'teki her alan hakkında ayrıntı bile vermedik ve vermemize de gerek yok: haftanın günlerinin nasıl çalışması gerektiği açık. Mevcut haliyle kullanırsak, herhangi bir geliştirici kodumuzda neler olduğunu anlayacaktır. Enum'un rahatlığına bir başka örnek de, sabitlerinin switch deyimi ile kullanılabilmesidir. Örneğin, yemeklerin güne göre programlandığı katı bir diyet için bir program yazalım:
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
}
}
}
Bu, Enums'un Java 1.5'ten önce kullanılan eski çözüme göre avantajlarından biridir — eski çözüm, switch ile kullanılamaz . Enum hakkında bilmeniz gereken başka neler var ? Enum, bunun gerektirdiği tüm olasılıklara sahip gerçek bir sınıftır. Örneğin, haftanın günlerinin mevcut uygulaması yetersizse DayOfWeek'e değişkenler, yapıcılar ve yöntemler ekleyebilirsiniz :
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 + '\'' +
'}';
}
}
Artık Enum sabitlerimizin bir başlık alanı, alıcısı ve geçersiz kılınan toString yöntemi var. Normal sınıflarla karşılaştırıldığında, Enum'a ciddi bir sınırlama getirildi - miras alınamaz. Ek olarak, numaralandırmaların karakteristik yöntemleri vardır:
-
values() : Enum içindeki tüm değerlerin bir dizisini döndürür :
public static void main(String[] args) { System.out.println(Arrays.toString(DayOfWeek.values())); }
Çıktı:
[DayOfWeek{title = 'Pazar'}, DayOfWeek{title = 'Pazartesi'}, DayOfWeek{title = 'Salı'}, DayOfWeek{title = 'Çarşamba'}, DayOfWeek{title = 'Perşembe'}, DayOfWeek{title = 'Cuma'}, DayOfWeek{title = 'Cumartesi'}]
-
ordinal() : sabitin sıra sayısını döndürür. Numaralandırma sıfırdan başlar:
public static void main(String[] args) { int sundayIndex = DayOfWeek.SUNDAY.ordinal(); System.out.println(sundayIndex); }
Çıktı:
0
- valueOf() : iletilen ada karşılık gelen Enum nesnesini döndürür:
public static void main(String[] args) { DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY"); System.out.println(sunday); }
Çıktı:
DayOfWeek{title = 'Pazar'}
Daha fazla okuma: |
---|
GO TO FULL VERSION