CodeGym /Kurslar /Java SELF AZ /Yeni Data Tipi – enum: siyahı

Yeni Data Tipi – enum: siyahı

Java SELF AZ
Səviyyə , Dərs
Mövcuddur

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
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY
}
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
Day day = Day.FRIDAY;
System.out.println(day);
Ekranda belə göstəriləcək:
FRIDAY


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
Day[] days = Day.values();

for (Day day: days)
   System.out.println(day);







System.out.println(days[2]);
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:
MONDAY
TUESDAY
WEDNESDAY
THURSDAY
FRIDAY
SATURDAY
SUNDAY

WEDNESDAY

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ışı
System.out.println(Day.MONDAY.ordinal());
System.out.println(Day.FRIDAY.ordinal());
System.out.println(Day.SUNDAY.ordinal());
0
4
6


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
public class Day
{
   public static final Day MONDAY = new Day(0);
   public static final Day TUESDAY = new Day(1);
   public static final Day WEDNESDAY = new Day(2);
   public static final Day THURSDAY = new Day(3);
   public static final Day FRIDAY = new Day(4);
   public static final Day SATURDAY = new Day(5);
   public static final Day SUNDAY = new Day(6);

    private static final Day[] array = {MONDAY, TUESDAY,
      WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY};

   private final int value;

   private Day (int value)
   {
      this.value = value;
   }

   public int ordinal()
   {
      return this.value;
   }

   public static Day[] values()
   {
      return array;
   }
}
Sinif Day

Statik sabit dəyərlərin siyahısı







Day tipli bütün dəyərlərin olduğu massiv


Day obyektinin konkret dəyəri ilə dəyişən

private 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
public class Day
{
  private int value;

  private Day (int value)
  {
    this.value = value;
  }

  public int ordinal()
  {
    return this.value;
  }
}


Dəyişən value Day obyektinin dəyərini saxlayır

Day 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
Day day = Day.MONDAY;
int index = day.ordinal();
Day newDay = Day.values()[index+2];
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
enum Day
{
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY,
   SUNDAY;

   public static List<Day> asList()
   {
      ArrayList<Day> list = new ArrayList<Day>();

      Collections.addAll(list, values());

      return list;
   }

}








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<Day> list = Day.asList();
list dəyişənində enum Day-ın bütün dəyərlərinin siyahısı saxlanacaq.
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION