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 üzvləri
Elementlər -class'ın
enum
). Sadalama Java-da dərhal görünmədi. enum
1.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.
enum tikintisi
Bir nümunə ilə başlayaq.enum
Mö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əenum
biz ü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.Enum
yoxlamaq hələ də asandır : enum
reflection
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. enum
Sonra, 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 enum
statik 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: enum
Season
==
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.Enum
Misal:
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()
və toString()
burada göstərilir ordinal()
. Metodların semantikası göz qabağındadır. Qeyd etmək lazımdır ki, bu üsullar enum
sinifdən miras qalmışdır java.lang.Enum
. Elementin enum
adının sətir təsviri ilə əldə edilməsi Çox vaxt vəzifə elementi enum
onun simli təsviri ilə əldə etməkdən yaranır. Bu məqsədlər üçün, hər bir enum
sinifdə 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: EnumClass
name
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: null
null
enum
enum
public 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.Enum
enum
enum
enum
enum
enum
enum
enum
Type
INT
INTEGER
STRING
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)
. INT
Eyni zamanda , siniflərin obyektləri bir nüsxədə mövcuddur və statik olaraq əlçatandır INTEGER
. STRING
Bunu 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 Type
və -dən əldə edilən 3 nested
sinif yaratmışdır Type
.
Mirasla ayrılmış enum-sinif
Type
Yuxarı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 :
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ırenum
. 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/
GO TO FULL VERSION