CodeGym /Kurslar /JAVA 25 SELF /Enumerasiya: enum

Enumerasiya: enum

JAVA 25 SELF
Səviyyə , Dərs
Mövcuddur

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ıö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
}
enum enumerasiyasının elan sintaksisi

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 ==.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!

Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION