Enumeration (
Enum ) Java 5 -də təqdim edildi və o vaxtdan bəri Java tərtibatçıları arasında olduqca populyarlaşdı. Müxtəlif Java proqramlarında geniş istifadə olunur.
Java-da Enum C və ya C++ ilə müqayisədə daha çox yönlü olduğundan, o, həmçinin bir çox maraqlı istifadə hallarını təqdim edir, onlardan bir neçəsini Java-da Enumdan istifadə etməyin 10 yolları məqaləsində gördüyünüz . Lakin bu populyarlığa baxmayaraq, bir çox Java proqramçıları hələ də Enum tərəfindən təmin edilən funksionallıqdan və Java kodunda Enum-dan istifadənin incəliklərindən xəbərsizdirlər.
Bu, məsələn,
Enum-un Java-da interfeys tətbiq etmək qabiliyyəti və ya
Enum-u niyə Enum-dan kənarda qura bilməməyimiz barədə soruşan bir neçə oxucudan aydın oldu və müsahibədə onlardan bu barədə soruşulduqlarını qeyd etdi.
Bu, bizi Java Enum-da tez-tez verilən sualların siyahısını tərtib etməyə ruhlandırdı ki, bunlar təkcə müsahibələrdə uğur qazanmağınıza kömək etmir, həm də öyrənmə üçün yeni imkanlar açır. Daha əvvəl qeyd edildiyi kimi, tez-tez müsahibə sualları sizi mövzuya daha ciddi yanaşmağa məcbur edir, bu pis bir şey deyil və Enumun gücünü və faydalılığını nəzərə alaraq, enum ustası olmağın vaxtı gəldi. Aşağıda Enumun müxtəlif funksionallığı və xüsusiyyətlərinə əsaslanan sualların siyahısı verilmişdir. Siz ondan müsahibə üçün hazırlıq materialı və ya sadəcə siyahıyaalma üçün bələdçi kimi istifadə edə bilərsiniz. Əgər Java-da yenisinizsə, Enum haqqında çoxlu yeni və faydalı şeylər öyrənəcəksiniz.
1) Enum Java-da interfeys tətbiq edə bilərmi? Bəli,
Enum interfeysləri miras ala bilər .
Enum növü sinfə və
interfeysə bənzədiyi üçün o, interfeysi miras ala bilər. Bu, bəzi hallarda Enum-dan xüsusi bir tətbiq kimi istifadə etməkdə inanılmaz rahatlıq verir.
Budur, Enum-u bu keyfiyyətdə istifadə etməyin yaxşı bir nümunəsi.
2) Enum sinfi miras ala (genişləndirə bilər)? Yox, bacarmaz! Gözlənilməz, çünki əvvəllər Enum tipinin Java-dakı sinif və ya interfeysə bənzədiyi deyilirdi. Bu sualın əvvəlki sualdan dərhal sonra verilməsinin əsas səbəbi budur.
Enum artıq java.lang.Enum
mücərrəd sinfindən miras aldığından , aydındır ki, Java çox sinif irsiyyətini dəstəkləmədiyi üçün başqa bir sinif miras ala bilməyəcək.
java.lang.Enum- dan miras alaraq , bütün enumlar
ordinal() ,
values() və ya
valueOf() metodlarına malikdir .
3) Obyekt nümunələri olmadan Enum necə yaradılır?
Bu kompilyasiya xətası olmadan mümkündürmü? Bu, müsahibə verənlərin sevdiyi
çətin suallardan biridir . Enum,
həftənin günləri və ya
ilin ayları kimi müəyyən sayda obyektlərin toplusu kimi göründüyü üçün,
heç bir şey olmadan Enum əldə etmək şübhəli görünür. Ancaq bəli,
nümunələr olmadan bir Enum yarada bilərsiniz , məsələn, bir köməkçi sinif yaratmaqla. Bu, Enum-dan istifadə etməyin başqa bir innovativ yoludur:
4) Biz Enum üçün toString() metodunu ləğv edə bilərikmi?
Yenidən təyin etməsək nə olar? Əlbəttə ki, siz Enum-un
toString() metodunu ləğv edə bilərsiniz, çünki siz
java.lang.Object-i miras alan və mövcud
toString() metodu olan istənilən sinfi ləğv edə bilərsiniz və belə etməsəniz belə, heç nə itirməyəcəksiniz, çünki mücərrəd Enum sinfinin bazası bunu sizin üçün edəcək və Enum instansiyasının adı olan adı qaytaracaq. Budur, Enum sinfindən
toString() metodu üçün kod :
ad, tərtibçi Enum sinfinin özündə nümunə yaratmağa cavab olaraq enum yaratmaq üçün kod ayırdıqda, həmçinin konstruktorda ordinal yaratdıqda təyin olunur.
java.lang.Enum sinfi : Bu, proqramda Enum elanına cavab olaraq kompilyator tərəfindən çağırılan
enum yaratmaq üçün yeganə konstruktordur .
5) Enum-dan kənarda bir Enum yarada bilərikmi?
Niyə də yox? Siz
Enumun hüdudlarından kənarda bir Enum yarada bilməzsiniz, çünki Enumda
ictimai yoxdur
public enum MessageUtil{ ; // required to avoid compiler error, also signifies no instance public static boolean isValid() { throw new UnsupportedOperationException("Not supported yet."); } }
public String toString() { return name; }
protected Enum(String name, int ordinal) { this.name = name; this.ordinal = ordinal; }
konstruktor və kompilyator hər hansı belə konstruktoru təqdim etməyə imkan verməyəcək.
Kompilyator Enum tipli bəyannaməyə cavab olaraq əksər kodlar yaratdığından, Enumlar daxilində ictimai konstruktorlara icazə vermir və Enum instansiyalarını daxili elan etməyə məcbur edir.
6) Enum daxilində konstruktor təyin edə bilərikmi? Bu sual tez-tez əvvəlki sualdan sonra verilir.
Bəli, edə bilərsiniz, lakin unutmayın ki, bu, yalnız özəl və ya
paketli özəl konstruktorlarla mümkündür .
Enumda ictimai və
qorunan konstruktorlara icazə verilmir. Burada
bir nümunə görə bilərsiniz.
7) == və ya equals() metodundan istifadə edərək Enum-u müqayisə etmək arasında fərq nədir?
Bu, burada ətraflı şəkildə əhatə olunan çox geniş və çətin məsələdir .
8) Enum-da ordinal() metodu nə edir?
ordinal() metodu Enum instansiyalarının Enum daxilində təyin olunduğu sıranı qaytarır. Məsələn,
DayOfWeek Enum-da siz günləri ardıcıllıqla təyin edə bilərsiniz: və əgər
DayOfWeek.MONDAY.ordinal()
public enum DayOfWeek{ MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY; }
metodunu çağırsaq , o, 0-ı qaytaracaq - bu, birinci instansiya deməkdir. Bu üsul işin faktiki vəziyyətinə uyğun nizamı təmin etmək üçün çox faydalıdır: yəni
ÇƏRŞƏNBƏNİNİN (Çərşənbə axşamı)
BAZAR EDƏNƏNİNDƏN (Bazar ertəsi) sonra və
ÇƏRŞƏNBƏDƏN (Çərşənbə) əvvəl gəldiyini göstərmək üçün . Eynilə, ilin aylarını təmsil etmək üçün siyahıdan istifadə edə bilərsiniz, burada fevral yanvardan sonra gəlir, lakin martdan əvvəl gəlir.
Bütün fərdi siyahılar bu metodu java.lang.Enum abstrakt sinifindən miras alır və onlar ad və sıra qəbul edən
java.lang.Enum -da
qorunan konstruktoru çağırmaqla kompilyator tərəfindən təyin edilir .
9) Java-da TreeSet və ya TreeMap ilə Enum-dan istifadə etmək mümkündürmü? Bu, həqiqətən maraqlı bir Enum sualıdır və insanların biliklərinin dərinliyini yoxlamaq üçün soruşmağı xoşlayırlar.
Java.lang.Enum koduna baxana qədər yəqin ki, Enumun
TreeSet və
TreeMap kimi sifarişli kolleksiyalarda istifadə üçün əsas tələb olan
Müqayisəli interfeysi miras aldığını bilməyəcəksiniz . Enum defolt olaraq
Müqayisə edilə bilən interfeysi miras aldığı üçün ondan
TreeSet və
TreeMap ilə istifadə oluna bilər .
10) Enum-da ordinal() və compareTo() arasındakı fərq nədir? Bu, birbaşa əvvəlki sualdan irəli gəlir: əslində,
compareTo() metodun təqdim etdiyi sıranı simulyasiya edir
ordinal() , Enumun təbii sırasıdır. Qısacası, Enum müqayisələri elan olunduğu ardıcıllıqla məhdudlaşdırır. Həmçinin, yadda saxlamaq lazımdır ki, bu sabitlər yalnız eyni tipli digər sabitlərlə müqayisə oluna bilər - müxtəlif növ sabitlərin müqayisəsi kompilyator xətasına səbəb ola bilər.
11) Enum-dan keçid qutusunda istifadə etmək mümkündürmü? Bəli sən bacararsan. Üstəlik, bu, Enum istifadə etməyin əsas üstünlüklərindən biridir. Enum nümunələri müvəqqəti sabitə tərtib edildiyi üçün siz onları təhlükəsiz şəkildə
case və keçidin içərisinə yeridə bilərsiniz . Budur, həftənin günləri ilə kod nümunəsi:
public void developerState(DayOfWeek today){ switch(today){ case MONDAY: System.out.println("Hmmmmmmmm"); break; case TUESDAY: System.out.println("Hmmmm"); break; case FRIDAY : System.out.println("Yeahhhhhh"); break; } }
Enum və Switch bir-birini yaxşı tamamlayır, xüsusən də Enum az sayda sabit sabitləri ehtiva edirsə, məsələn, həftənin yeddi günü, ilin 12 ayı və s.
Enum ilə
swith case istifadəsinin digər nümunələri .
12) Bütün Enum instansiyasını necə təkrarlamaq olar?
Əgər java.lang.Enum açmısınızsa , siz bilirsiniz ki,
values() metodu bütün Enum sabitlərinin massivini qaytarır.
Hər bir nömrə java.lang.Enum-u miras qoyduğu üçün onların
values() metodu var . Bundan istifadə edərək, müəyyən bir növ siyahının bütün sabitləri ilə təkrarlaya bilərsiniz.
Bunun foreach döngəsi və
values() metodu ilə keçdiyi
nümunələrə baxın .
13) Enum-u singleton kimi istifadə etməyin müsbət və mənfi cəhətləri hansılardır? Enum təkton nümunəsini həyata keçirmək üçün
sürətli qısa yol təqdim edir və hətta Effektiv Java kitabında da əhatə olunduğu üçün bu, məşhur seçimdir. İlk baxışdan, Enum singletonu perspektivlidir və kifayət qədər rahatdır, məsələn, instantasiyaya nəzarət edir, etibarlı şəkildə seriallaşdırıla bilir və hər şeydən əvvəl, Enum istifadə edərək iplik təhlükəsiz singleton yaratmaq asandır. Dəyişənlərin dəyişkənliyini iki dəfə yoxlamaq üçün artıq narahat olmaq lazım deyil.
Bu yanaşmanın istifadəsinin müsbət və mənfi tərəfləri haqqında daha çox oxuyun .
14) İnt enumeration və String enumeration modelləri əvəzinə Enum istifadə etməyin faydası nədir? Əgər siz 5 ildən artıq proqramlaşdırma ilə məşğul olmusunuzsa və hələ də JDK 1.3 və ya 1.4-dəsinizsə, siz tanınmış sabitlər toplusunu təmsil etmək üçün
ictimai statik yekun sabit prefiksdən istifadə edən
String və int nömrələmə nümunələri ilə tanış olacaqsınız.
Həftənin günləri kimi bir çox şey . Burada çoxlu problemlər var: sizin Enum tipindən müstəqillik yoxdur, çünki həftənin gününə cavabdeh olan
String dəyişəni istənilən ixtiyari qiymət ala bilər. Eynilə, sadalanan
int istənilən dəyəri qəbul edə bilər və tərtibçi onu məmnuniyyətlə udacaq. Və istifadə
Enum , siz kompilyatorun sizin üçün yoxladığı tip təhlükəsizliyini əldə edirsiniz. Bütün Java tərtibatçılarına oxumaq tövsiyə olunan Effektiv Java-da bu mövzuda maraqlı fikirlər var.
15) Stringi Enum-a necə çevirmək olar? Bu , Java proqramlarının hazırlanmasında
String və
Enum istifadəsinin populyarlığına görə gündəmə gələn gündəlik sualdır .
Enum-u Stringə çevirməyin ən yaxşı yolu , Enum-un özündə
String arqumentlərini götürəcək və onu
Enum kimi qaytaracaq zavod metodunu təyin etməkdir . Siz həmçinin hadisəyə məhəl qoymamaq istəyə bilərsiniz. Burada sətirlərin siyahıya çevrilməsinə dair bəzi
nümunələr verilmişdir. Bu, bizi Enum haqqında 15 sualdan (
və cavablardan ) ibarət siyahımızın sonuna gətirir .
Ancaq unutmayın:
öyrənmək üçün oxumaq kifayət deyil, bu yalnız ilk addımdır . Enumlardan faydalanmaq üçün layihənizdə Enum-dan harada istifadə edə biləcəyinizi tapmağa çalışın - bu sizə real dünya təcrübəsi verəcək və bu təcrübə ilə siz nümunələrdən daha çox şey öyrənəcəksiniz, çünki daha çox həll edə biləcəyiniz daha çox problemlə qarşılaşacaqsınız. mürəkkəb və müfəssəl yollar.tələblər.
Enum haqqında bu suallara , xüsusən də müsahibəyə tələsirsinizsə və Enum kainatında təfərrüatlı bir şəkildə dalmağa vaxtınız yoxdursa, biliklərinizi yoxlamaq üçün diqqət yetirməyə dəyər.
GO TO FULL VERSION