1. История на enum
възникването
Днес ще изследваме друг вид тип данни в Java: enum
. Името enum
идва от думата изброяване . Какъв е този тип данни и за Howво е?
Понякога програмист трябва да създаде нов тип данни, чиито възможни стойности са ограничени до малък фиксиран списък.
Например един DayOfTheWeek
тип може да приема само стойностите MONDAY
, TUESDAY
, WEDNESDAY
, ... Има общо 7 стойности. Или един Month
тип може да приема само стойностите JANUARY
, FEBRUARY
, MARCH
, ... Има общо 12 стойности.
Разбира се, можете да използвате числа ( int
типа): 1
— понеделник, 2
— вторник и т.н. Но някой може случайно да присвои невалидни стойности като 8
or 0
на вашата променлива.
Лесно може да имате ситуация, в която един програмист смята, че дните от седмицата (or месеците от годината) са номерирани, започвайки от нула, докато други очакват тяхното номериране да започва от едно и т.н.
Ето защо Java въведе enum
тип данни, който се състои от краен набор от стойности .
2. Деклариране на тип
Декларирането на нов enum
тип данни изглежда така:
enum TypeName
{
VALUE1,
VALUE2,
VALUE3
}
Къде TypeName
е името на новия тип (клас), а възможните стойности са разделени със запетаи и опаковани във фигурни скоби: Value1
, Value2
, Value3
.
Като пример, нека създадем наш собствен DayOfTheWeek
enum
:
Код | Забележка |
---|---|
|
Нов Day тип понеделник вторник сряда четвъртък петък събота неделя |
Ето How присвоявате стойност на променлива от нашия нов тип:
Day day = Day.MONDAY;
Пример:
Код | Забележка |
---|---|
|
Изходът на екрана ще бъде:
|
3. Методи на анenum
Един enum
тип има няколко вградени метода, два от които са много интересни:
Статичният values()
метод връща масив от всички стойности от enum
типа:
Код | Забележка |
---|---|
|
Променливата days съхранява масив, съдържащ стойностите от Day типа (7 елемента) Показване на съдържанието на масива на екрана:
|
Методът ordinal()
връща поредния номер на константата. Извиквате го на enum
стойност, а не на enum
клас:
Код | Конзолен изход |
---|---|
|
|
4. Преобразуване в клас
Всъщност тук няма нищо магическо. Компилаторът просто ни даде малко синтактична захар. По време на компилация Day
enum се преобразува в обикновен клас:
Код, опростена version | Забележка |
---|---|
|
Day клас Списък със статични константи Масив с всички стойности на Day enum Променлива, която съхранява стойността на конкретен Day обект Класът е частен, което означава, че обекти от Day класа могат да бъдат създадени само вътре в класа. Методът трябва да бъде извикан на обект. Връща стойността на обекта — полето. Методът връща статичен масив с всички стойности на класаconstructor Day Day ordinal Day value Day |
Ако премахнем всички статични методи и променливи от Day
класа, получаваме следното:
Код | Забележка |
---|---|
|
Променливата value съхранява стойността на Day обекта Day , обектите могат да бъдат създадени само вътре в Day класа, тъй като конструкторът е private . Методът ordinal() връща value на Day обекта. |
С други думи, тук не се случва нищо страшно. Компилаторът създава Day
класа, добавя константите, които представляват стойностите enum
, добавя необходимите методи и прави конструктора на класа private
. Ще разгледаме How работят конструкторите малко по-късно.
Надяваме се, че вече е ясно защо присвояваме стойност на променлива по този начин:
Day day = Day.MONDAY;
MONDAY
е просто статично поле (константа) в Day
класа. Когато осъществявате достъп до статични методи и полета извън класа, трябва да посочите името на класа преди името на полето or метода.
5. Повече методи на anenum
Всеки enum
клас има няколко интересни функции.
Преобразуване към и от низ
За да конвертирате enum обект в низ, трябва да извикате неговия toString()
метод.
String str = Day.MONDAY.toString();
За да конвертирате в другата посока (от низ към Day
обект), можете да използвате статичния valueOf()
метод:
Day day = Day.valueOf("MONDAY");
Това е супер удобно и ще бъде полезно в много случаи.
Преобразуване в число и обратно
Вече знаете How да конвертирате enum
обект в число: извикайте ordinal()
метода:
int index = Day.MONDAY.ordinal();
За да преобразувате в другата посока (от число към Day
обект), имате нужда от по-прозрачна конструкция:
Day day = Day.values()[2];
Примери:
Код | Забележка |
---|---|
|
Понеделник Вземете индекса на понеделник: 0 Ден от седмицата 2 дни след понеделник |
Важен момент: тъй като enum
стойностите са фиксиран набор от константи, те могат да се сравняват с помощта на == . С други думи, не можете да имате два еднакви MONDAY
обекта с различен address. Съществува само един екземпляр от всяка стойност на enum. И това означава, че сравняването на променливи enum с помощта на == винаги ще работи.
6. Добавяне на ваши собствени методи къмenum
Тъй като един enum
се превръща в обикновен клас по време на компorране, можете да декларирате методи в него. Тези методи просто се добавят към класа, който компилаторът генерира. Да предположим например, че искаме Day enum
да върнем списък от стойности на enum, а не масив.
Тогава можем да добавим следния code:
Код | Забележка |
---|---|
|
След списъка със стойности се изисква точка и запетая. Създайте ArrayList обект Добавете стойностите в масива, върнат от values() метода. Върнете списъка. |
Сега този метод може да бъде извикан в code:
Код | Забележка |
---|---|
|
Променливата list ще съхранява списък с всички стойности на Day enum . |
GO TO FULL VERSION