JavaRush /Java Blogu /Random-AZ /Java-da siyahılar (java enum)
articles
Səviyyə

Java-da siyahılar (java enum)

Qrupda dərc edilmişdir
Proqramlaşdırma zamanı biz tez-tez müəyyən bir məlumat növü üçün etibarlı dəyərlər dəstini məhdudlaşdırmaq ehtiyacı ilə qarşılaşırıq. Beləliklə, məsələn, həftənin günü 7 fərqli dəyərə sahib ola bilər, ilin ayı 12, mövsüm isə 4 ola bilər. Bu cür problemləri həll etmək üçün bir çox statik tipli proqramlaşdırma dilləri xüsusi bir məlumat növü təqdim edir - sadalama ( enum). Sadalama Java-da dərhal görünmədi. enum1.5 versiyasından başlayaraq xüsusi dil konstruksiyası təqdim edildi. Bu nöqtəyə qədər proqramçılar sadalamaları həyata keçirmək üçün başqa üsullardan istifadə etmişlər. Java-da sadalamalar (java enum) - 1

enum tikintisi

Bir nümunə ilə başlayaq. enumMövsümün saxlanması üçün məlumat növünü təsvir edək :
enum Season { WINTER, SPRING, SUMMER, AUTUMN }
Yaxşı, onun istifadəsinə sadə bir nümunə:
Season season = Season.SPRING;
if (season == Season.SPRING) season = Season.SUMMER;
System.out.println(season);
Bunun nəticəsində YAY konsola çap olunacaq . Hesab edirəm ki, misal aydındır və izaha ehtiyac yoxdur.

Enum bir sinifdir

Elan etməklə enumbiz üstüörtülü olaraq -dən əldə edilmiş bir sinif yaradırıq java.lang.Enum. Şərti olaraq, tikinti enum Season { ... }bərabərdir class Season extends java.lang.Enum { ... }. Kompilyator bizə açıq şəkildə bizdən miras almağa imkan verməsə də , istifadə edərək onun miras qaldığını java.lang.Enumyoxlamaq hələ də asandır : enumreflection
System.out.println(Season.class.getSuperclass());
Konsolda aşağıdakılar görünəcək:
class java.lang.Enum
Həqiqi miras bizim üçün avtomatik olaraq Java tərtibçisi tərəfindən həyata keçirilir. enumSonra, sadalamağı həyata keçirmək üçün kompilyator tərəfindən yaradılan sinfi -class və sadalanan növün mümkün dəyərlərini -a elementləri adlandırmağa razılaşaq enum.

Enum üzvləri enumstatik olaraq əlçatan olan -class nümunələridir

Elementlər -class'ın enum Season (WINTER, SPRING и т.д.)statik olaraq əlçatan nümunələridir . Onların statik mövcudluğu bizə istinad müqayisə operatorundan istifadə edərək müqayisələr aparmağa imkan verir . Misal: enumSeason==
Season season = Season.SUMMER;
if (season == Season.AUTUMN) season = Season.WINTER;

Enum elementinin adı və seriya nömrəsi

Daha əvvəl qeyd edildiyi kimi, bütün siyahılar üçün faydalı olan bir sıra metodları ehtiva edən hər hansı enum-class miras alır . java.lang.EnumMisal:
Season season = Season.WINTER;
System.out.println("season.name()=" + season.name() + " season.toString()=" + season.toString() + " season.ordinal()=" + season.ordinal());
Çıxış belə olacaq:
season.name()=WINTER season.toString()=WINTER season.ordinal()=0
Metodlar name()toString()burada göstərilir ordinal(). Metodların semantikası göz qabağındadır. Qeyd etmək lazımdır ki, bu üsullar enumsinifdən miras qalmışdır java.lang.Enum. Elementin enumadının sətir təsviri ilə əldə edilməsi Çox vaxt vəzifə elementi enumonun simli təsviri ilə əldə etməkdən yaranır. Bu məqsədlər üçün, hər bir enumsinifdə kompilyator avtomatik olaraq xüsusi statik metod yaradır: --ə bərabər olan public static EnumClass valueOf(String name)bir sadalama elementini qaytarır . İstifadə nümunəsi: EnumClassname
String name = "WINTER";
Season season = Season.valueOf(name);
Kodun icrası nəticəsində mövsüm dəyişəni bərabər olacaq Season.WINTER. Nəzərə alın ki , element tapılmazsa, IllegalArgumentException atılacaq və bərabərdirsə name, NullPointerException atılacaq . Yeri gəlmişkən, bu, çox vaxt unudulur. Nədənsə, bir çoxları əmindirlər ki, əgər funksiya bir arqument götürsə və müəyyən şərtlər altında IllegalArgumentException atırsa , onu ora ötürən zaman mütləq IllegalArgumentException da atılacaq . Amma bu məsələnin kənarındadır. Davam edək. Sadalamanın bütün elementlərinin əldə edilməsi Bəzən işləmə zamanı -class-ın bütün elementlərinin siyahısını əldə etməlisiniz . Bu məqsədlər üçün kompilyator hər sinifdə bir metod yaradır . İstifadə nümunəsi: nullnullenumenumpublic static EnumClass[] values()
System.out.println(Arrays.toString(Season.values()));
Aşağıdakı çıxışı alırıq:
[WINTER, SPRING, SUMMER, AUTUMN]
Nəzərə alın ki, sinifdə nə metod valueOf(), nə də metod müəyyən edilməyib . Bunun əvəzinə, -class tərtib edildikdə onlar avtomatik olaraq kompilyator tərəfindən əlavə olunur . -class -a öz metodlarınızı əlavə etmək Siz həm -class-a, həm də onun elementlərinə öz metodlarınızı əlavə etmək imkanınız var : Eyni, lakin polimorfizmlə: Son nümunə mirasdan istifadəni nümayiş etdirir . Bu haqda daha sonra. Java -da varislik , obyektləri bir instansiyada yaradılan və statik olaraq əlçatan olan sinif iyerarxiyasını həyata keçirməyə imkan verir. Bu halda elementlər öz konstruktorlarını ehtiva edə bilər. Nümunə verək: Burada üç elementdən ibarət bir siyahı elan edirik və . Kompilyator aşağıdakı sinifləri və obyektləri yaradacaq: values()java.lang.EnumenumenumenumJava-da sadalamalar (java enum) - 2Java-da sadalamalar (java enum) - 3enumenumenumenumJava-da sadalamalar (java enum) - 4TypeINTINTEGERSTRING
  • Type-dən əldə edilən sinifjava.lang.Enum
  • INT— mənşəli 1-ci sinif obyektiType
  • INTEGER— mənşəli 2-ci sinif obyektiType
  • STRING— mənşəli 3-cü sinif obyektiType
Object parse(String)Polimorfik metod və konstruktor ilə üç törəmə sinif yaradılacaq Type(..., boolean). INTEyni zamanda , siniflərin obyektləri bir nüsxədə mövcuddur və statik olaraq əlçatandır INTEGER. STRINGBunu yoxlaya bilərsiniz:
System.out.println(Type.class);
System.out.println(Type.INT.getClass() + " " + Type.INT.getClass().getSuperclass());
System.out.println(Type.INTEGER.getClass() + " " + Type.INTEGER.getClass().getSuperclass());
System.out.println(Type.STRING.getClass()  + " " + Type.STRING.getClass().getSuperclass());
Aşağıdakı çıxışı alırıq:
class Type
class Type$1 class Type
class Type$2 class Type
class Type$3 class Type
Görünür ki, kompilyator bir sinif Typevə -dən əldə edilən 3 nestedsinif yaratmışdır Type.

Mirasla ayrılmış enum-sinif

TypeYuxarıdakıları təsdiqləmək üçün yuxarıdakı nümunədən siyahının dekompilyasiyasının nəticəsini də təqdim edirik :Java-da sadalamalar (java enum) - 5

Sadalamalar və parametrik polimorfizm

Oxucu təəccüblənə bilər: " Niyə yuxarıdakı Növ siyahılarında generiklərdən istifadə edilmir? " Fakt budur ki, Java-da generiklərin istifadəsi qadağandır enum. Beləliklə, aşağıdakı nümunə tərtib edilməyəcək:
enum Type<T> {}

Əlavə Tədqiqat

Sadalamaların Java-da necə işlədiyini daha dərindən başa düşmək üçün mən sizə sinifin mənbə kodu ilə tanış olmağı java.lang.Enum, həmçinin yaradılan kodu öyrənmək üçün Jad dekompilyatorundan istifadə etməyi tövsiyə edirəm. Bundan əlavə, Java kitabxanasının mənbə kodunu öyrənmək Java-da neçə mexanizmin işlədiyini başa düşmək üçün tamamilə zəruridir və obyekt yönümlü dizayn üçün istinad kimi faydalıdır. Orijinal mənbəyə keçid: http://alexander.lds.lg.ua/
Şərhlər
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION