Enum och alla dess funktioner - 1

"Hej, Amigo!"

"Hej, Amigo!"

"Jag ska berätta om något mycket intressant. Det är ganska enkelt, men det gör det ännu mer intressant. Det kallas en enum. En enum är en typ som definierar den specifika uppsättning värden som en variabel kan ha. Låt oss titta på vid ett exempel direkt:"

Definition av en enumklass
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}
Använder en uppräkning
Direction direction = Direction.LEFT;

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

"Så vi listar bara en uppsättning värden och det är det?"

"Ja, vi deklarerar en enum och listar alla dess möjliga värden inuti, avgränsade med kommatecken."

"Det är också ganska lätt att använda."

"Kan du ställa in den på null?"

"Ja, en enum är en vanlig klass, eller snarare det är ungefär som en klass, liknande hur gränssnitt är som klasser."

"Så var jag än kan använda klasser, kan jag använda enum?"

"Ja."

"Kan jag deklarera en uppräkning i en klass?"

"Ja."

"Och ärva en uppräkning?"

"Nej, du kan inte ärva en enum och en enum kan inte ärva andra klasser."

"Varför är det så?"

"Eftersom Java-kompilatorn konverterar enums till ungefär detta:

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
}

"Som du kan se från detta exempel:"

1) Klassen Direction ärver absolut klassen Enum, så den kan inte ärva något annat.

2) Direction-klassen deklareras som final, så inget annat kan ärva den.

3) Riktningsklassens variabler är faktiskt offentliga statiska slutliga Riktningsvariabler. Detta är uppenbart i kod som använder dem:

Riktningsriktning = Riktning .VÄNSTER ;

4) Klassen Direction innehåller bara en konstruktor och den är privat. Det betyder att Direction-objekt endast kan skapas med kod i klassen. Andra än de deklarerade objekten kan inga objekt skapas.

5) Riktningsvariabler kan tilldelas en referens till vilket som helst av de befintliga Direction-objekten. De är alla satta inom enumen. Det finns inga andra objekt av den här typen, och det kommer inte att finnas några andra i framtiden.

6) Riktningsobjekt kan jämföras med «==», vilket bara kommer att utföra en enkel referensjämförelse."

"Jag skulle inte säga att det är supertydligt, men det är mycket tydligare efter ditt exempel."

"Bra. Då kommer här lite mer information till dig:"

1) Varje Direction-objekt har sitt eget unika nummer. Den första (UPP) är 0, den andra (DOWN) är 1, den tredje (VÄNSTER) är 2, etc. Du kan få det här talet med metoden ordningsföljd(). "Kolla på skärmen:

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

2) Varje enum har en värdes ()-metod som returnerar en uppsättning av enumens värden.

int leftIndex = Direction.LEFT.ordinal();

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

"Detta betyder att vi kan få indexet för vilket enumelement som helst och sedan få elementet igen med det indexet."

"Vi kan också använda en enum i en foreach loop:"

for (Direction direction : Direction.values())
{
 System.out.println(direction);
}
Skärmutgång:
UP
DOWN
LEFT
RIGHT

"Betyder det att enum åsidosätter toString-metoden? När allt kommer omkring visar den inte något liknande:" «
com.codegym.Direction@123fd4»?

"Ja. Dessutom kan varje enum, och därför riktning, konverteras till en sträng och vice versa."

Konvertera till en sträng:
String left = Direction.LEFT.toString(); // left == "LEFT";
Konvertera en sträng till en enum:
Direction direction = Direction.valueOf("LEFT");

"Åh, förstår."

"Vad händer om du skickar en sträng till funktionen valueOf som inte är i Direction? Till exempel «AMIGO»?"

"Vad tror du?"

"Ett undantag?"

"Japp. Ett Undantag för IllegalArgument."

"Tja, det avslutar vår introduktion till enumsvärlden."