1. Giriş
Proqramlaşdırmada tez-tez əvvəlcədən məlum, məhdud variantlar siyahısı ilə işləmək lazım olur. Məsələn: həftənin günləri, svetoforun rəngləri, oyunun çətinlik səviyyələri, sifariş statusları. Bu variantların hər biri adətən sabit bir dəyərlə təqdim olunur. Elə burada da bugünkü mövzumuza — enumerasiyalara (enum) yaxınlaşırıq.
Enumerasiya — adlandırılmış sabitlər toplusunu elan etməyə imkan verən xüsusi verilənlər tipidir.
enum — sanki hüceyrələrə düzülmüş etiketlərlə bir qutu kimidir; hər etiket ədədlə əlaqələndirilmiş unikal addır.
enum-un əsas üstünlükləri:
- Kodunuz oxunaqlı və özünü sənədləşdirən olur;
- 0, 1, 2 kimi anlaşılmaz «sehrli ədədlər» əvəzinə ifadəli adlar yaranır: DayOfWeek.MONDAY və ya TrafficLight.RED;
- Yanlış dəyər təyin etməyə cəhd etsəniz, kompilyator xəbərdarlıq edəcək;
- Hər elementin arxasında adi bir tam ədəd dayanır! (Amma buna hələ qayıdacağıq.)
enum elanının sintaksisi
// Enumerasiya elanının ümumi şablonu
public enum Imya
{
KONSTANTA1 ,
KONSTANTA2 ,
KONSTANTA3
}
Java-da enumerasiya elan etmək çox sadədir. Budur əsas nümunə:
// Fayl DayOfWeek.java
public enum DayOfWeek {
MONDAY, // 0
TUESDAY, // 1
WEDNESDAY, // 2
THURSDAY, // 3
FRIDAY, // 4
SATURDAY, // 5
SUNDAY // 6
}
İzah:
- enum açar sözü kompilyatora bildirir: «Bu, enumerasiyadır!»
- Fiqurlu mötərizələr arasında vergüllə variantların (konstantların) adları gəlir.
- Adları UPPER_SNAKE_CASE şəklində yazmaq qəbul olunub (bütün hərflər böyük, sözlər alt xətlə ayrılır).
enum harada elan oluna bilər?
- Ayrı faylda (DayOfWeek.java).
- Sinifin içində (yalnız həmin sinif üçün özəl enumerasiya lazım olduqda).
- Hətta metod daxilində (amma bu nadir hallarda edilir).
2. Koddə enum-dan istifadə
enum tipində dəyişənin elanı:
DayOfWeek today = DayOfWeek.MONDAY;
Artıq today yalnız DayOfWeek-də elan edilmiş dəyərlərdən birini ala bilər.
switch-də istifadəyə nümunə
switch (today)
{
case MONDAY:
System.out.println("Eh, bazar ertəsi...");
break;
case FRIDAY:
System.out.println("Hurra, cümə!");
break;
default:
System.out.println("Adi gün.");
}
Vacib fərq: əgər dəyişənin tipi kompilyatora artıq məlumdursa, case-də sadəcə konstanta adını (prefikssiz) yazırıq.
enum-un bütün dəyərlərinin keçilməsi
Hər bir enum-un bütün dəyərlərinin massivini qaytaran statik values() metodu var:
for (DayOfWeek day : DayOfWeek.values())
{
System.out.println(day);
}
Bu, menyu çıxarmaq, yoxlama aparmaq, variantlar yaratmaq və s. üçün çox rahatdır.
3. enum metodları: name(), ordinal(), valueOf()
Java-da enumerasiyalar sadəcə konstanlar siyahısı deyil, metodları olan tamhüquqlu siniflərdir!
name() metodu
Konstantanın adını sətir kimi qaytarır (koddakı yazıldığı kimi):
DayOfWeek day = DayOfWeek.FRIDAY;
System.out.println(day.name()); // "FRIDAY"
ordinal() metodu
Konstantanın sıra nömrəsini qaytarır (sayma sıfırdan başlayır):
System.out.println(DayOfWeek.MONDAY.ordinal()); // 0
System.out.println(DayOfWeek.FRIDAY.ordinal()); // 4
Diqqət: Gələcəkdə ardıcıllıq dəyişə bilərsə, enum-u ordinal() ilə saxlamaq və ya müqayisə etmək düzgün deyil! Adlardan istifadə etmək daha yaxşıdır.
valueOf(String name) metodu
Əgər belə konstanta mövcuddursa, sətiri enum dəyərinə çevirir:
DayOfWeek day = DayOfWeek.valueOf("MONDAY");
System.out.println(day); // MONDAY
Əgər sətir uyğun gəlmirsə — IllegalArgumentException istisnası atılacaq.
values() metodu
enum-un bütün dəyərlərinin massivini qaytarır (yuxarıda nümunə vardı):
DayOfWeek[] days = DayOfWeek.values();
4. Sahələr, konstruktor və metodlarla enum
Java-da enumerasiyaları genişləndirmək olar: sahələr, konstruktorlar, metodlar əlavə etmək! Bəli, bu sadəcə adlar siyahısı deyil, mini-sinifdir.
Nümunə: həftə günləri lokallaşdırılmış adla
public enum DayOfWeek
{
MONDAY("Ponedel’nik"),
TUESDAY("Vtornik"),
WEDNESDAY("Sreda"),
THURSDAY("Chetverg"),
FRIDAY("Pyatnitsa"),
SATURDAY("Subbota"),
SUNDAY("Voskresen’e");
private final String russianName;
// Konstruktor (susmaya görə private)
DayOfWeek(String russianName)
{
this.russianName = russianName;
}
public String getRussianName()
{
return russianName;
}
}
Bu necə işlədiyini daha ətraflı səviyyə 27+‑də OOP‑a başlayanda öyrənəcəksiniz :P
İndi belə edə bilərsiniz:
DayOfWeek day = DayOfWeek.WEDNESDAY;
System.out.println(day.getRussianName()); // "Sreda"
Faydalı məqam: Hər enum dəyərinin öz məlumatı ola bilər (bu nümunədə — rus dilində ad).
enum-dan istifadənin üstünlükləri
- Tipin təhlükəsizliyi: enum tipli dəyişənə siyahıda olmayan dəyər təsadüfən verilə bilməz.
- Oxunaqlılıq: kod özünü sənədləşdirir (TrafficLight.RED əvəzinə 1 və ya "red").
- Dəstək rahatlığı: variant əlavə etmək və ya silmək lazım olduqda, bunu bir yerdə edirsiniz.
- switch ilə işləyir: enum dəyərlərə görə budaqlanma üçün ideal uyğundur.
- Genişləndirilə bilər: sahələr, metodlar əlavə etmək, interfeysləri reallaşdırmaq olar.
- Daha az səhv: kompilyator variantları emal etməyi unutmağınıza imkan verməyəcək (xüsusilə switch konstruksiyalarında).
6. Təcrübə: tətbiqimizdə enum-dan istifadə
Gəlin mini-tətbiqimizə enum vasitəsilə həftə günləri dəstəyini əlavə edək.
Addım 1. enum elan edək
public enum DayOfWeek
{
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY
}
Addım 2. Koddə istifadə edək
System.out.println("Həftənin gününü daxil edin (məsələn, MONDAY):");
Scanner console = new Scanner(System.in);
String input = console.nextLine().toUpperCase();
DayOfWeek day = DayOfWeek.valueOf(input);
switch (day)
{
case MONDAY:
System.out.println("İş həftəsinin başlanğıcı!");
break;
case FRIDAY:
System.out.println("Tezliklə istirahət günləri!");
break;
case SATURDAY:
case SUNDAY:
System.out.println("Hurra, istirahət günləri!");
break;
default:
System.out.println("Adi iş günü.");
}
Nə baş verir:
- İstifadəçi həftə gününü daxil edir (məsələn, "monday" və ya "MONDAY").
- Registrdən asılı olmamaq üçün sətiri böyük hərfə çeviririk (toUpperCase()).
- Sətiri valueOf vasitəsilə enum dəyərinə çeviririk.
- Müxtəlif mesajlar çıxarmaq üçün switch-dən istifadə edirik.
- Əgər nəsə səhv daxil edilibsə — xətanı tutub xəbərdarlıq edirik.
7. enum ilə işləyərkən tipik səhvlər
Səhv №1: enum əvəzinə sətrlər və ya ədədlərdən istifadə. Çox vaxt yeni başlayanlar hələ də belə yazırlar:
int day = 1; // 1 — bu bazar ertəsidir?
və ya
String status = "DELIVERED";
Bu pisdir: yazılışda səhv etmək olar, kodu dəstəkləmək çətindir. enum-dan istifadə edin!
Səhv №2: enum-u == və .equals() ilə müqayisə etmək. Java-da enum dəyərlərini == ilə müqayisə etmək təhlükəsizdir, çünki bütün dəyərlər enum sinifi çərçivəsində unikal olur:
if (day == DayOfWeek.MONDAY) { ... } // OK!
.equals() da işləyir, amma daha çox == istifadə olunur.
Səhv №3: enum elementləri üçün zəif adlar. Elementləri VALUE1, VALUE2, VALUE3 kimi adlandırmayın — bir aydan sonra heç kim bunun nə demək olduğunu başa düşməyəcək! Məzmunlu adlardan istifadə edin.
Səhv №4: məntiq üçün ordinal()-dan istifadə. Belə yazmayın:
if (day.ordinal() == 0) { ... } // Lazım deyil!
Elementlərin sırası dəyişə bilər və hər şey pozular. Adlardan istifadə edin!
GO TO FULL VERSION