Enum i wszystkie jego funkcje - 1

"Cześć, Amigo!"

"Cześć, Amigo!"

„Opowiem ci o czymś bardzo interesującym. Jest to dość proste, ale przez to jeszcze bardziej interesujące. Nazywa się enum. Enum to typ, który definiuje określony zestaw wartości, jakie może mieć zmienna. Spójrzmy od razu na przykładzie:"

Definicja klasy enum
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}
Używanie wyliczenia
Direction direction = Direction.LEFT;

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

„Więc po prostu wymieniamy zestaw wartości i to wszystko?”

„Tak, deklarujemy wyliczenie i umieszczamy w nim wszystkie możliwe wartości, oddzielone przecinkiem”.

„Jest również dość łatwy w użyciu”.

"Czy możesz ustawić to na zero?"

„Tak, enum to zwykła klasa, a raczej coś w rodzaju klasy, podobnie jak interfejsy są jak klasy”.

„Więc gdziekolwiek mogę używać klas, czy mogę używać enum?”

"Tak."

„Czy mogę zadeklarować wyliczenie w klasie?”

"Tak."

„I odziedziczyć enum?”

„Nie, nie możesz odziedziczyć wyliczenia, a wyliczenie nie może dziedziczyć innych klas”.

"Dlaczego?"

„Ponieważ kompilator Java konwertuje wyliczenia na mniej więcej to:

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
}

„Jak widać na tym przykładzie:”

1) Klasa Direction absolutnie dziedziczy klasę Enum, więc nie może dziedziczyć niczego innego.

2) Klasa Direction jest deklarowana jako ostateczna, więc nic innego nie może jej odziedziczyć.

3) Zmienne klasy Direction są w rzeczywistości publicznymi statycznymi końcowymi zmiennymi Direction. Jest to widoczne w kodzie, który ich używa:

Kierunek kierunek = Kierunek .LEWO ;

4) Klasa Direction zawiera tylko jeden konstruktor i jest prywatna. Oznacza to, że obiekty Direction można tworzyć tylko przy użyciu kodu wewnątrz klasy. Poza zadeklarowanymi obiektami nie można utworzyć żadnych obiektów.

5) Zmiennym kierunku można przypisać odniesienie do dowolnego istniejącego obiektu kierunku. Wszystkie są ustawione w enum. Innych obiektów tego typu nie ma i nie będzie w przyszłości.

6) Obiekty kierunkowe można porównać za pomocą «==», co po prostu wykona proste porównanie odniesienia.

„Nie powiedziałbym, że jest to super jasne, ale po twoim przykładzie jest znacznie jaśniejsze”.

„Świetnie. Oto trochę więcej informacji dla Ciebie:”

1) Każdy obiekt Direction ma swój unikalny numer. Pierwsza (GÓRA) to 0, druga (DÓŁ) to 1, trzecia (LEWA) to 2 itd. Możesz uzyskać tę liczbę za pomocą metody porządkowej(). "Spójrz na ekran:

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

2) Każde wyliczenie ma metodę values ​​(), która zwraca tablicę wartości wyliczenia.

int leftIndex = Direction.LEFT.ordinal();

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

„Oznacza to, że możemy uzyskać indeks dowolnego elementu wyliczeniowego, a następnie ponownie pobrać element przy użyciu tego indeksu”.

„Możemy również użyć wyliczenia w pętli foreach :”

for (Direction direction : Direction.values())
{
 System.out.println(direction);
}
Wyjście ekranu:
UP
DOWN
LEFT
RIGHT

„Czy to oznacza, że ​​enum zastępuje metodę toString? W końcu nie wyświetla nic takiego:”
«com.codegym.Direction@123fd4»?

„Tak. Co więcej, każde wyliczenie, a co za tym idzie Kierunek, można przekonwertować na Łańcuch i odwrotnie”.

Konwertuj na ciąg:
String left = Direction.LEFT.toString(); // left == "LEFT";
Konwertuj ciąg na wyliczenie:
Direction direction = Direction.valueOf("LEFT");

"Ach, rozumiem."

„Co się stanie, jeśli przekażesz ciąg znaków do funkcji valueOf, która nie jest w kierunku? Na przykład «AMIGO»?”

"Co myślisz?"

"Wyjątek?"

„Tak. Wyjątek IllegalArgument”.

„Cóż, to kończy nasze wprowadzenie do świata wyliczeń”.