1. enum
-un yaranma tarixçəsi
Bu gün biz Java-da başqa bir data tipini, yəni enum
-u öyrənəcəyik. enum
sözü Enumeration — sıralama sözündən götürülüb. Onda bu data tipi nədir və necə istifadə olunur?
Bəzən proqramçı işində elə bir ehtiyac olur ki, yeni bir data tipi yaratmaq lazım gəlir və həmin tipin dəyişənləri yalnız kiçik, sabit bir siyahıdan olan dəyərləri ala bilər.
Məsələn, HəftəGünü
tipi yalnız BAZAR ERTƏSİ
, ÇƏRŞƏNBƏ AXŞAMI
, ÇƏRŞƏNBƏ
, ... Cəmi 7 dəyər ala bilər. Və ya Ay
tipi yalnız YANVAR
, FEVRAL
, MART
, ... Cəmi 12 dəyər ala bilər.
Əlbəttə, rəqəmlərdən də istifadə etmək olar (məsələn, int
tipi): 1
— bazar ertəsi, 2
— çərşənbə axşamı və s. Amma kimsə bilməyərəkdən belə bir dəyişənə 8
və ya məsələn, 0
dəyərini təyin edə bilər.
Asanlıqla bir vəziyyət yarana bilər ki, bir proqramçı həftə günlərinin (və ya ayların) sıfırdan başlandığını düşünsün, digəri isə bir-dən başladığını və s.
Ona görə də Java-da sonlu dəyərlər dəstindən ibarət olan data tipi — enum
yaradılmışdır.
2. Tip elan etmək
Yeni enum
verilənlər tipi belə elan edilir:
enum TipAdi
{
DEYER1,
DEYER2,
DEYER3
}
Burada TipAdi
— yeni tipin (sinfin) adı, və mötərizələrdə vergüllə ayrılmış mümkün dəyərlər göstərilib: Dəyər1
, Dəyər2
, Dəyər3
.
Nümunə üçün gəlin enum
yaradaq, bu tip HəftəninGünü
olacaq:
Kod | Qeyd |
---|---|
|
Yeni tip Day Bazartesi Çərşənbə axşamı Çərşənbə Cümə axşamı Cümə Şənbə Bazar |
Bu tipdə olan dəyişənlərə dəyərləri bu cür təyin etmək olar:
Day day = Day.MONDAY;
Nümunə:
Kod | Qeyd |
---|---|
|
Ekranda belə göstəriləcək: |
3. enum
’un metodları
enum
tipi bir neçə daxili metoda sahibdir, bunlardan ikisi çox maraqlıdır:
Statik metod values()
enum
tipinin bütün dəyərləri olan massiv qaytarır:
Kod | Qeyd |
---|---|
|
days dəyişəninə Day tipinin dəyərlərindən ibarət massiv (7 ədəd) yazılır.Massivin məzmununu ekrana çıxarırıq: |
ordinal()
metodu konstantanın sıralama nömrəsini qaytarır. Onu enum
sinfində deyil, enum
dəyərində çağırmaq lazımdır:
Kod | Ekran çıxışı |
---|---|
|
|
4. Sinfə çevrilmə
Əslində burda heç bir möcüzə yoxdur, kompilyator sadəcə bizə bir az sintaktik şəkər əlavə edib. Kompilyasiya zamanı enum Day
sinfi adi sinfə çevrilir:
Kod, sadələşdirilmiş versiya | Qeyd |
---|---|
|
Sinif Day Statik sabit dəyərlərin siyahısı Day tipli bütün dəyərlərin olduğu massivDay obyektinin konkret dəyəri ilə dəyişənprivate sinfin konstruktoru Day - Day sinfi daxilində yaradılan obyektlər.ordinal metodunu Day obyektində çağırmaq lazımdır.Bu obyektin dəyərini qaytarır — value .Metod, Day sinfinin bütün dəyərləri ilə statik massiv qaytarır. |
Əgər Day
sinfindən bütün statik metodları və dəyişənləri çıxarsaq, belə nəticə alınır:
Kod | Qeyd |
---|---|
|
Dəyişən value Day obyektinin dəyərini saxlayırDay obyektlərini yalnız Day sinfi daxilində yaratmaq olar — private konstruktor.ordinal() metodu Day obyektinin value dəyərini qaytarır. |
Yəni, əslində burada heç bir qorxulu şey yoxdur. Kompilyator Day
sinfini yaradır, sonra ona enum
-da göstərilən konstantları əlavə edir, çatışmayan metodları yaradır və sinfin konstruktorunu private
edir. Konstruktorların necə işlədiyini bir az sonra öyrənəcəyik.
İndi düşünürəm ki, dəyişəni belə doldurmağımız aydın oldu:
Day day = Day.MONDAY;
MONDAY
— sadəcə Day
sinfinin statik sahəsi (konstantdır). Sinifdən kənarda statik metodlara və sahələrə müraciət edərkən sahənin və ya metodun adı qarşısında sinfin adı göstərilməlidir.
5. enum
-ın başqa metodları
Bütün enum
-class-ların bir neçə maraqlı xüsusiyyəti var.
Sətirə və geri çevirmək
Enum tipli obyekti sətirə çevirmək üçün, ona toString()
metodunu çağırmalısınız.
String str = Day.MONDAY.toString();
Geri çevirmək üçün (sətirdən Day
obyektinə) statik metod istifadə edə bilərsiniz: valueOf()
:
Day day = Day.valueOf("MONDAY");
Çox rahat və bir çox hallarda faydalıdır.
Rəqəmə və geri çevirmək
Enum tipli obyekti rəqəmə çevirməyin yolunu artıq bilirsiniz: bunun üçün ordinal()
metodunu çağırmaq lazımdır:
int index = Day.MONDAY.ordinal();
Geri çevirmək üçün (rəqəmdən Day
obyektinə) bir az uzun konstruktor istifadə etmək lazımdır:
Day day = Day.values()[2];
Nümunələr:
Kod | Qeyd |
---|---|
|
Bazar ertəsi Bazar ertəsinin indeksini alırıq (0) Bazar ertəsindən 2 gün sonra olan həftə günü |
Vacib məqam, enum tipli dəyərlər sabit bir konstanstlar dəsti olaraq təsvir olunur. Onlar == ilə müqayisə edilə bilər. Axı iki müxtəlif MONDAY
obyektinin fərqli referanslarla mövcudluğu mümkün deyil. Hər bir enum tipli obyekt-dəyər yalnız bir nüsxədə mövcuddur. Buna görə də, enum tipli dəyişənlərin == ilə müqayisəsi həmişə işləyəcək.
6. Öz metodlarımızı enum
'a əlavə etmək
Çünki enum
kompilyasiya zamanı adi sinfə çevrilir, ona metodlar əlavə etmək olar: bu metodlar kompilyatorun yaratdığı sinfə əlavə olunacaq. Məsələn, biz istəyirik ki, bizim enum Day
dəyərlər massivini deyil, siyahı qaytarsın.
Bu halda ona belə kod əlavə edə bilərsiniz:
Kod | Qeyd |
---|---|
|
Dəyərlər siyahısından sonra nöqtəli vergül qoyulmalıdır. ArrayList obyektini yaradırıq.Massivdən dəyərləri əlavə edirik: bu metod values() qaytarır.Siyahını qaytarırıq. |
İndi bu metodu kodda çağırmaq olar:
Kod | Qeyd |
---|---|
|
list dəyişənində enum Day -ın bütün dəyərlərinin siyahısı saxlanacaq. |
GO TO FULL VERSION