Enum и всички негови функции - 1

„Здрасти, Амиго!“

„Здрасти, Амиго!“

„Ще ви разкажа за нещо много интересно. Доста е просто, но това го прави още по-интересно. Нарича се enum. Enum е тип, който дефинира специфичния набор от стойности, които една променлива може да има. Нека да погледнем в пример веднага:"

Дефиниция на enum клас
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}
Използване на enum
Direction direction = Direction.LEFT;

if (direction == Direction.LEFT)
 direction = Direction.RIGHT;
else
 direction = Direction.DOWN;

„Значи просто изброяваме набор от стойности и това е?“

„Да, ние декларираме enum и изброяваме всички негови възможни стойности вътре, разделени със запетая.“

„Също така е доста лесен за използване.“

„Можете ли да го зададете на нула?“

„Да, enum е обикновен клас, or по-скоро е нещо като клас, подобно на това How интерфейсите са като класове.“

„И така, където мога да използвам класове, мога ли да използвам enum?“

— Да.

„Мога ли да декларирам enum вътре в клас?“

— Да.

„И да наследим enum?“

„Не, не можете да наследите enum и enum не може да наследи други класове.“

"Защо така?"

„Тъй като компилаторът на Java преобразува enum приблизително в това:

public final class Direction extends Enum
{
 public static final Direction UP = new Direction();
 public static final Direction DOWN = new Direction();
 public static final Direction LEFT = new Direction();
 public static final Direction RIGHT = new Direction();

 private Direction() {} // Private constructor
}

„Както можете да видите от този пример:“

1) Класът Direction абсолютно наследява класа Enum, така че не може да наследи нищо друго.

2) Класът Direction е деклариран като окончателен, така че нищо друго не може да го наследи.

3) Променливите на класа Direction всъщност са публични статични окончателни променливи Direction. Това е очевидно в codeа, който ги използва:

Direction direction = Direction .LEFT ;

4) Класът Direction съдържа само един конструктор и той е частен. Това означава, че обектите Direction могат да бъдат създадени само с помощта на code вътре в класа. Освен декларираните обекти не могат да се създават други обекти.

5) Променливите за посока могат да бъдат присвоени препратки към всеки от съществуващите обекти за посока. Всички те са зададени в enum. Други обекти от този тип няма и няма да има в бъдеще.

6) Обектите за посока могат да бъдат сравнени с помощта на «==», което просто ще извърши просто сравнение на референтни данни."

„Не бих казал, че е супер ясно, но е много по-ясно след вашия пример.“

„Страхотно. Тогава ето още малко информация за вас:“

1) Всеки обект Direction има свой собствен уникален номер. Първото (UP) е 0, второто (DOWN) е 1, третото (LEFT) е 2 и т.н. Можете да получите това число с помощта на метода ordinal(). „Погледнете екрана:

Direction direction = Direction.LEFT;
int index = direction.ordinal();
int index2 = Direction.RIGHT.ordinal();

2) Всяко enum има метод values ​​(), който връща масив от стойностите на enum.

int leftIndex = Direction.LEFT.ordinal();

Direction[] array = Direction.values();
Direction left = array[leftIndex];

„Това означава, че можем да получим индекса на всеки enum елемент и след това да получим елемента отново, използвайки този индекс.“

„Можем също да използваме enum в foreach цикъл:“

for (Direction direction : Direction.values())
{
 System.out.println(direction);
}
Изход на екрана:
UP
DOWN
LEFT
RIGHT

„Това означава ли, че enum отменя метода toString? В края на краищата, той не показва нищо като:“
«com.codegym.Direction@123fd4»?

„Да. Освен това всяко преброяване и следователно Direction може да се преобразува в низ и обратно.“

Преобразуване в низ:
String left = Direction.LEFT.toString(); // left == "LEFT";
Преобразувайте низ в enum:
Direction direction = Direction.valueOf("LEFT");

— О, разбрах.

"Какво се случва, ако подадете низ към функцията valueOf, която не е в Direction? Например, «AMIGO»?"

"Какво мислиш?"

"Изключение?"

„Да. Изключение за незаконен аргумент.“

„Е, това приключва нашето въведение в света на енумите.“