„Здрасти, Амиго!“
„Здрасти, Амиго!“
„Ще ви разкажа за нещо много интересно. Доста е просто, но това го прави още по-интересно. Нарича се enum. Enum е тип, който дефинира специфичния набор от стойности, които една променлива може да има. Нека да погледнем в пример веднага:"
public enum Direction
{
UP,
DOWN,
LEFT,
RIGHT,
}
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";
Direction direction = Direction.valueOf("LEFT");
— О, разбрах.
"Какво се случва, ако подадете низ към функцията valueOf, която не е в Direction? Например, «AMIGO»?"
"Какво мислиш?"
"Изключение?"
„Да. Изключение за незаконен аргумент.“
„Е, това приключва нашето въведение в света на енумите.“
GO TO FULL VERSION