JavaRush /Java блогы /Random-KK /Java тіліндегі тізімдер (java enum)
articles
Деңгей

Java тіліндегі тізімдер (java enum)

Топта жарияланған
Бағдарламалау кезінде біз белгілі бір деректер түрі үшін жарамды мәндер жинағын шектеу қажеттілігіне жиі тап боламыз. Мәселен, мысалы, апта күні 7 түрлі мәнге ие болуы мүмкін, жыл айы 12, маусымда 4 болуы мүмкін. Мұндай мәселелерді шешу үшін көптеген статикалық терілген бағдарламалау тілдері арнайы деректер түрін ұсынады - санау ( enum). Тізім Java тілінде бірден пайда болған жоқ. Арнайы тіл құрылымы enum1.5 нұсқасынан бастап енгізілді. Осы уақытқа дейін бағдарламашылар санауды жүзеге асыру үшін басқа әдістерді қолданды. Java тіліндегі тізімдер (java enum) - 1

enum құрылысы

Мысалдан бастайық. 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тексеру әлі де оңай : enumreflection
System.out.println(Season.class.getSuperclass());
Консольде келесілер көрсетіледі:
class java.lang.Enum
Нақты мұраны біз үшін Java компиляторы автоматты түрде орындайды. Әрі қарай, санауды жүзеге асыру үшін компилятор жасаған классты -class деп атауға келісейік enum, ал тізімделген түрдің мүмкін мәндерін enum-a элементтері ретінде.

Enum мүшелері enumстатикалық түрде қол жетімді -сынып даналары болып табылады

Элементтер -сыныптың enum Season (WINTER, SPRING и т.д.)статикалық қол жетімді даналары болып табылады . Олардың статикалық қолжетімділігі анықтамалық салыстыру операторының көмегімен салыстырулар жүргізуге мүмкіндік береді . Мысалы: enumSeason==
Season season = Season.SUMMER;
if (season == Season.AUTUMN) season = Season.WINTER;

Enum элементінің аты және сериялық нөмірі

Бұрын айтылғандай, кез келген 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)санау элементін қайтарады . Қолдану мысалы: EnumClassname
String name = "WINTER";
Season season = Season.valueOf(name);
Кодты орындау нәтижесінде маусым айнымалысы -ге тең болады Season.WINTER. Егер элемент табылмаса, IllegalArgumentException жіберілетінін , ал егер ол nameтең болса null, NullPointerException жіберілетінін ескеріңіз . Айтпақшы, бұл жиі ұмытылады. Қандай да бір себептермен, егер функция бір аргумент қабылдаса және белгілі бір жағдайларда IllegalArgumentException шығарса , оны сол жерге жібергенде , міндетті түрде IllegalArgumentExceptionnull да тасталатынына көптеген адамдар сенімді . Бірақ бұл мәселеден басқа. жалғастырайық. Тізімнің барлық элементтерін алу Кейде орындау уақытында -сыныптың барлық элементтерінің тізімін алу қажет . Осы мақсаттар үшін компилятор әрбір -сыныпта әдіс жасайды . Қолдану мысалы: enumenumpublic static EnumClass[] values()
System.out.println(Arrays.toString(Season.values()));
Біз келесі нәтижені аламыз:
[WINTER, SPRING, SUMMER, AUTUMN]
Сыныпта әдіс valueOf()те, әдіс те анықталмағанын ескеріңіз . Оның орнына, олар -сынып құрастырылған кезде компилятор арқылы автоматты түрде қосылады . -сыныпқа өз әдістеріңізді қосу -сыныпқа да, оның элементтеріне де өз әдістеріңізді қосу мүмкіндігіңіз бар : Дәл солай, бірақ полиморфизммен: Соңғы мысалда мұраны пайдалану көрсетілген . Бұл туралы кейінірек. Java тіліндегі мұра нысандары бір данада жасалған және статикалық түрде қол жетімді болатын класс иерархиясын жүзеге асыруға мүмкіндік береді. Бұл жағдайда элементтерде өздерінің конструкторлары болуы мүмкін. Мысал келтірейік: Мұнда біз , және үш элементі бар санауды жариялаймыз . Компилятор келесі сыныптар мен нысандарды жасайды: values()java.lang.EnumenumenumenumJava тіліндегі тізімдер (java enum) - 2Java тіліндегі тізімдер (java enum) - 3enumenumenumenumJava тіліндегі тізімдер (java enum) - 4TypeINTINTEGERSTRING
  • Type-дан алынған классjava.lang.Enum
  • INT— 1-ші кластың an objectісінен алынғанType
  • INTEGER— 2-ші кластың an objectісінен алынғанType
  • STRING— 3-ші кластың an objectісінен алынғанType
Object parse(String)Полиморфты әдіспен және конструктормен үш туынды сынып құрылады Type(..., boolean). Сонымен қатар, сыныптардың an objectілері INTбір көшірмеде бар және статикалық түрде қол жетімді 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Компилятор класты және nested-ден алынған 3 классты жасағанын көруге болады Type.

Мұрагерлікпен декомпиляцияланған санау класы

TypeЖоғарыда айтылғандарды растау үшін біз жоғарыдағы мысалдан санауды декомпиляциялау нәтижесін ұсынамыз :Java тіліндегі тізімдер (java enum) - 5

Санау және параметрлік полиморфизм

Оқырман сұрақ қоюы мүмкін: " Неліктен жоғарыда аталған түр тізімі генериктерді пайдаланбайды? " Өйткені Java-да генериктерді пайдалануға enumтыйым салынған. Сондықтан келесі мысал құрастырылмайды:
enum Type<T> {}

Қосымша оқу

Java тілінде санаулар қалай жұмыс істейтінін тереңірек түсіну үшін мен сізге класстың бастапқы codeымен танысуды java.lang.Enum, сондай-ақ жасалған codeты зерттеу үшін Jad декомпиляторын пайдалануды ұсынамын. Сонымен қатар, Java кітапханасының бастапқы codeын зерттеу Java-дағы қанша механизм жұмыс істейтінін түсіну үшін өте қажет және an objectіге бағытталған дизайнға сілтеме ретінде пайдалы. Түпнұсқа дереккөзге сілтеме: http://alexander.lds.lg.ua/
Пікірлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION