Бағдарламалау кезінде біз белгілі бір деректер түрі үшін жарамды мәндер жинағын шектеу қажеттілігіне жиі тап боламыз. Мәселен, мысалы, апта күні 7 түрлі мәнге ие болуы мүмкін, жыл айы 12, маусымда 4 болуы мүмкін. Мұндай мәселелерді шешу үшін көптеген статикалық терілген бағдарламалау тілдері арнайы деректер түрін ұсынады - санау ( Enum мүшелері
Элементтер -сыныптың
enum
). Тізім Java тілінде бірден пайда болған жоқ. Арнайы тіл құрылымы enum
1.5 нұсқасынан бастап енгізілді. Осы уақытқа дейін бағдарламашылар санауды жүзеге асыру үшін басқа әдістерді қолданды.
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
тексеру әлі де оңай : enum
reflection
System.out.println(Season.class.getSuperclass());
Консольде келесілер көрсетіледі:
class java.lang.Enum
Нақты мұраны біз үшін Java компиляторы автоматты түрде орындайды. Әрі қарай, санауды жүзеге асыру үшін компилятор жасаған классты -class деп атауға келісейік enum
, ал тізімделген түрдің мүмкін мәндерін enum
-a элементтері ретінде.
Enum мүшелері enum
статикалық түрде қол жетімді -сынып даналары болып табылады
Элементтер -сыныптың enum Season (WINTER, SPRING и т.д.)
статикалық қол жетімді даналары болып табылады . Олардың статикалық қолжетімділігі анықтамалық салыстыру операторының көмегімен салыстырулар жүргізуге мүмкіндік береді . Мысалы: enum
Season
==
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)
санау элементін қайтарады . Қолдану мысалы: EnumClass
name
String name = "WINTER";
Season season = Season.valueOf(name);
Кодты орындау нәтижесінде маусым айнымалысы -ге тең болады Season.WINTER
. Егер элемент табылмаса, IllegalArgumentException жіберілетінін , ал егер ол name
тең болса null
, NullPointerException жіберілетінін ескеріңіз . Айтпақшы, бұл жиі ұмытылады. Қандай да бір себептермен, егер функция бір аргумент қабылдаса және белгілі бір жағдайларда IllegalArgumentException шығарса , оны сол жерге жібергенде , міндетті түрде IllegalArgumentExceptionnull
да тасталатынына көптеген адамдар сенімді . Бірақ бұл мәселеден басқа. жалғастырайық. Тізімнің барлық элементтерін алу Кейде орындау уақытында -сыныптың барлық элементтерінің тізімін алу қажет . Осы мақсаттар үшін компилятор әрбір -сыныпта әдіс жасайды . Қолдану мысалы: enum
enum
public static EnumClass[] values()
System.out.println(Arrays.toString(Season.values()));
Біз келесі нәтижені аламыз:
[WINTER, SPRING, SUMMER, AUTUMN]
Сыныпта әдіс valueOf()
те, әдіс те анықталмағанын ескеріңіз . Оның орнына, олар -сынып құрастырылған кезде компилятор арқылы автоматты түрде қосылады . -сыныпқа өз әдістеріңізді қосу -сыныпқа да, оның элементтеріне де өз әдістеріңізді қосу мүмкіндігіңіз бар : Дәл солай, бірақ полиморфизммен: Соңғы мысалда мұраны пайдалану көрсетілген . Бұл туралы кейінірек. Java тіліндегі мұра нысандары бір данада жасалған және статикалық түрде қол жетімді болатын класс иерархиясын жүзеге асыруға мүмкіндік береді. Бұл жағдайда элементтерде өздерінің конструкторлары болуы мүмкін. Мысал келтірейік: Мұнда біз , және үш элементі бар санауды жариялаймыз . Компилятор келесі сыныптар мен нысандарды жасайды: values()
java.lang.Enum
enum
enum
enum
enum
enum
enum
enum
Type
INT
INTEGER
STRING
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-да генериктерді пайдалануғаenum
тыйым салынған. Сондықтан келесі мысал құрастырылмайды:
enum Type<T> {}
Қосымша оқу
Java тілінде санаулар қалай жұмыс істейтінін тереңірек түсіну үшін мен сізге класстың бастапқы codeымен танысудыjava.lang.Enum
, сондай-ақ жасалған codeты зерттеу үшін Jad декомпиляторын пайдалануды ұсынамын. Сонымен қатар, Java кітапханасының бастапқы codeын зерттеу Java-дағы қанша механизм жұмыс істейтінін түсіну үшін өте қажет және an objectіге бағытталған дизайнға сілтеме ретінде пайдалы. Түпнұсқа дереккөзге сілтеме: http://alexander.lds.lg.ua/
GO TO FULL VERSION