JavaRush /Блоги Java /Random-TG /Рӯйхатҳо дар Java (enum java)
articles
Сатҳи

Рӯйхатҳо дар Java (enum java)

Дар гурӯҳ нашр шудааст
Ҳангоми барномасозӣ, мо аксар вақт ба зарурати маҳдуд кардани маҷмӯи арзишҳои дуруст барои як намуди маълумот дучор мешавем. Ҳамин тавр, масалан, рӯзи ҳафта метавонад 7 арзиши гуногун дошта бошад, моҳи сол метавонад 12 ва мавсим 4 дошта бошад. Барои ҳалли чунин мушкилот, бисёр забонҳои барномасозии статикӣ навъи махсуси маълумотро пешниҳод мекунанд - рӯйхат ( enum). Рӯйхат дар Java фавран пайдо нашуд. Сохтмони махсуси забон enumаз versionи 1.5 оғоз карда шуд. То ин вақт, барномасозон усулҳои дигарро барои татбиқи рӯйхатҳо истифода мебурданд. Барӯйхатҳо дар Java (java enum) - 1

сохтмони энум

Биёед бо як мисол оғоз кунем. Биёед enumнамуди маълумотро барои нигоҳ доштани мавсим бо истифода аз:
enum Season { WINTER, SPRING, SUMMER, AUTUMN }
Хуб, як мисоли оддии истифодаи он:
Season season = Season.SPRING;
if (season == Season.SPRING) season = Season.SUMMER;
System.out.println(season);
Дар натиҷа, SUMMER ба консол чоп карда мешавад . Ман фикр мекунам, ки мисол равшан аст ва ба шарҳ ниёз надорад.

Enum як синф аст

Бо эълон кардан enum, мо ба таври ғайримустақим синферо эҷод мекунем, ки аз java.lang.Enum. Одатан, сохтмон enum Season { ... }ба class Season extends java.lang.Enum { ... }. Ва гарчанде ки компилятор ба мо имкон намедиҳад, ки аз java.lang.Enumмо ба таври возеҳ мерос бигирем, аммо тафтиш кардан осон аст, ки enumон бо истифода аз мерос гирифта шудааст reflection:
System.out.println(Season.class.getSuperclass());
Дар консол инҳо нишон дода мешаванд:
class java.lang.Enum
Мероси воқеиро ба таври худкор барои мо компилятори Java иҷро мекунад. Минбаъд, биёед розӣ шавем, ки синферо, ки аз ҷониби компилятор барои татбиқи номбаркунӣ сохта шудааст enum, -class ва арзишҳои эҳтимолии навъи номбаршуда ҳамчун enumунсур -a номида шавад.

Аъзоёни enum мисолҳои синфи -синф мебошанд enum, ки статикӣ дастрасанд

Элементҳо enum Season (WINTER, SPRING и т.д.)мисолҳои статикӣ дастраси enum-class мебошанд Season. Мавҷудияти статикии онҳо ба мо имкон медиҳад, ки бо истифода аз оператори муқоисаи истинод муқоиса кунем ==. Мисол:
Season season = Season.SUMMER;
if (season == Season.AUTUMN) season = Season.WINTER;

Ном ва рақами силсилавии элементи enum

Тавре ки қаблан зикр гардид, any enum-class мерос мегирад java.lang.Enum, ки дорои як қатор усулҳои муфид барои ҳама рӯйхатҳо мебошад. Мисол:
Season season = Season.WINTER;
System.out.println("season.name()=" + season.name() + " season.toString()=" + season.toString() + " season.ordinal()=" + season.ordinal());
Натиҷа чунин хоҳад буд:
season.name()=WINTER season.toString()=WINTER season.ordinal()=0
Усулҳо name()ва дар ин ҷо нишон toString()дода шудаанд ordinal(). Семантикаи усулҳо равшан аст. Бояд гуфт, ки ин усулҳо enumаз синф ба мерос гирифта шудаанд java.lang.Enum. Гирифтани элемент enumаз рӯи тасвири сатри номи он Аксар вақт вазифаи ба даст овардани элемент enumаз рӯи тасвири сатри он ба миён меояд. Бо ин мақсадҳо, дар ҳар як enumсинф, компилятор ба таври худкор усули махсуси статикӣ эҷод мекунад: public static EnumClass valueOf(String name), ки унсури номбаркуниро EnumClassбо номи баробар бар мегардонад name. Намунаи истифода:
String name = "WINTER";
Season season = Season.valueOf(name);
Дар натиҷаи иҷро кардани code, тағирёбандаи мавсим ба Season.WINTER. Лутфан таваҷҷӯҳ намоед, ки агар элемент ёфт нашавад, IllegalArgumentException партофта мешавад ва агар он nameбаробар бошад null, NullPointerException партофта мешавад . Дар омади гап, ин аксар вақт фаромӯш мешавад. Бо баъзе сабабҳо, бисёриҳо мутмаинанд, ки агар функсия як аргументро қабул кунад ва дар шароити муайян IllegalArgumentException -ро партояд , пас ҳангоми интиқоли он ба он ҷо албатта IllegalArgumentExceptionnull низ партофта мешавад . Аммо ин ба ҷои гап нест. Биёед идома диҳем. Гирифтани ҳамаи унсурҳои рӯйхат Баъзан ба шумо лозим меояд, ки дар вақти иҷро рӯйхати ҳамаи унсурҳои -class-ро гиред. Бо ин мақсадҳо, компилятор дар ҳар як -синф усул эҷод мекунад . Намунаи истифода: enumenumpublic static EnumClass[] values()
System.out.println(Arrays.toString(Season.values()));
Мо натиҷаи зеринро ба даст меорем:
[WINTER, SPRING, SUMMER, AUTUMN]
Дар хотир доред, ки на усул valueOf()ва на усул values()дар синф муайян карда нашудааст java.lang.Enum. enumБа ҷои ин, онҳо ҳангоми тартиб додани -синф аз ҷониби компилятор ба таври худкор илова карда мешаванд . Илова кардани усулҳои шахсии худ ба enum-class Шумо имкон доред, ки усулҳои худро ҳам ба enum-class ва ҳам ба унсурҳои он илова кунед: Барӯйхатҳо дар Java (java enum) - 2Ҳамин, аммо бо полиморфизм: Барӯйхатҳо дар Java (java enum) - 3Мисоли охирин истифодаи меросро дар enum. Муфассалтар дар ин бора баъдтар. Меросenum дар Java enumба шумо имкон медиҳад, ки иерархияи синфро амалӣ кунед, ки an objectҳои онҳо дар як мисол сохта шудаанд ва статикӣ дастрас мебошанд. Дар ин ҳолат, элементҳо enumметавонанд конструкторҳои худро дошта бошанд. Биёед мисол меорем: Барӯйхатҳо дар Java (java enum) - 4Дар ин ҷо мо номбарро Typeбо се унсури INT, INTEGERва STRING. Компилятор синфҳо ва an objectҳои зеринро эҷод мекунад:
  • Type- синф азjava.lang.Enum
  • INT— an objectи синфи 1, ки азType
  • INTEGER— an objectи синфи 2, ки азType
  • STRING— an objectи синфи 3, ки азType
Се синфи ҳосилшуда бо усули полиморфӣ Object parse(String)ва созанда сохта мешаванд Type(..., boolean). INTДар айни замон , an objectҳои синфҳо дар як нусха вуҷуд доранд ва ба таври статикӣ дастрас мебошанд INTEGER. STRINGШумо метавонед инро тасдиқ кунед:
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());
Мо натиҷаи зеринро ба даст меорем:
class Type
class Type$1 class Type
class Type$2 class Type
class Type$3 class Type
Дидан мумкин аст, ки компилятор як синф Typeва 3 nestedсинферо, ки аз Type.

Синфи номбаршуда бо мерос

Барои тасдиқи гуфтаҳои боло, мо инчунин натиҷаи декомпиляцияи рӯйхатро Typeаз мисоли боло пешниҳод мекунем: Барӯйхатҳо дар Java (java enum) - 5

Рӯйхатҳо ва полиморфизми параметрӣ

Хонанда метавонад дар ҳайрат бошад: " Чаро дар рӯйхатҳои навъи дар боло зикршуда генерикҳоро истифода намебаранд? " Гап дар он аст, ки дар Java истифодаи генерикҳо enumманъ аст. Ҳамин тавр, мисоли зерин тартиб дода намешавад:
enum Type<T> {}

Омӯзиши минбаъда

Барои амиқтар фаҳмидани он, ки чӣ гуна рӯйхатҳо дар Java кор мекунанд, ман тавсия медиҳам, ки шумо бо codeи ибтидоии синф шинос шавед java.lang.Enumва инчунин декомпилятори Jad-ро барои омӯзиши рамзи тавлидшуда истифода баред. Ғайр аз он, омӯзиши codeи сарчашмаи китобхонаи Java барои фаҳмидани он ки чӣ қадар механизмҳо дар Java кор мекунанд, комилан зарур аст ва ҳамчун истинод барои тарҳрезии ба an object нигаронидашуда муфид аст. Истинод ба манбаи аслӣ: http://alexander.lds.lg.ua/
Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION