Ҳангоми барномасозӣ, мо аксар вақт ба зарурати маҳдуд кардани маҷмӯи арзишҳои дуруст барои як намуди маълумот дучор мешавем. Ҳамин тавр, масалан, рӯзи ҳафта метавонад 7 арзиши гуногун дошта бошад, моҳи сол метавонад 12 ва мавсим 4 дошта бошад. Барои ҳалли чунин мушкилот, бисёр забонҳои барномасозии статикӣ навъи махсуси маълумотро пешниҳод мекунанд - рӯйхат ( Аъзоёни enum мисолҳои синфи -синф мебошанд
Элементҳо
enum
). Рӯйхат дар Java фавран пайдо нашуд. Сохтмони махсуси забон enum
аз versionи 1.5 оғоз карда шуд. То ин вақт, барномасозон усулҳои дигарро барои татбиқи рӯйхатҳо истифода мебурданд.
сохтмони энум
Биёед бо як мисол оғоз кунем. Биёед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
Тавре ки қаблан зикр гардид, anyenum
-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-ро гиред. Бо ин мақсадҳо, компилятор дар ҳар як -синф усул эҷод мекунад . Намунаи истифода: enum
enum
public static EnumClass[] values()
System.out.println(Arrays.toString(Season.values()));
Мо натиҷаи зеринро ба даст меорем:
[WINTER, SPRING, SUMMER, AUTUMN]
Дар хотир доред, ки на усул valueOf()
ва на усул values()
дар синф муайян карда нашудааст java.lang.Enum
. enum
Ба ҷои ин, онҳо ҳангоми тартиб додани -синф аз ҷониби компилятор ба таври худкор илова карда мешаванд . Илова кардани усулҳои шахсии худ ба enum
-class Шумо имкон доред, ки усулҳои худро ҳам ба enum
-class ва ҳам ба унсурҳои он илова кунед: Ҳамин, аммо бо полиморфизм: Мисоли охирин истифодаи меросро дар enum
. Муфассалтар дар ин бора баъдтар. Меросenum
дар Java enum
ба шумо имкон медиҳад, ки иерархияи синфро амалӣ кунед, ки an objectҳои онҳо дар як мисол сохта шудаанд ва статикӣ дастрас мебошанд. Дар ин ҳолат, элементҳо enum
метавонанд конструкторҳои худро дошта бошанд. Биёед мисол меорем: Дар ин ҷо мо номбарро 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 истифодаи генерикҳоenum
манъ аст. Ҳамин тавр, мисоли зерин тартиб дода намешавад:
enum Type<T> {}
Омӯзиши минбаъда
Барои амиқтар фаҳмидани он, ки чӣ гуна рӯйхатҳо дар Java кор мекунанд, ман тавсия медиҳам, ки шумо бо codeи ибтидоии синф шинос шаведjava.lang.Enum
ва инчунин декомпилятори Jad-ро барои омӯзиши рамзи тавлидшуда истифода баред. Ғайр аз он, омӯзиши codeи сарчашмаи китобхонаи Java барои фаҳмидани он ки чӣ қадар механизмҳо дар Java кор мекунанд, комилан зарур аст ва ҳамчун истинод барои тарҳрезии ба an object нигаронидашуда муфид аст. Истинод ба манбаи аслӣ: http://alexander.lds.lg.ua/
GO TO FULL VERSION