Enum og alle dets funktioner - 1

"Hej, Amigo!"

"Hej, Amigo!"

"Jeg vil fortælle dig om noget meget interessant. Det er ret simpelt, men det gør det endnu mere interessant. Det kaldes en enum. En enum er en type, der definerer det specifikke sæt af værdier, som en variabel kan have. Lad os se ved et eksempel lige ud:"

Definition af en enum-klasse
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}
Ved hjælp af en enum
Direction direction = Direction.LEFT;

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

"Så vi lister bare et sæt værdier, og det er det?"

"Ja, vi erklærer en enum og lister alle dens mulige værdier indeni, adskilt af et komma."

"Det er også ret nemt at bruge."

"Kan du sætte den til null?"

"Ja, en enum er en almindelig klasse, eller rettere det er lidt ligesom en klasse, svarende til hvordan grænseflader er som klasser."

"Så hvor jeg kan bruge klasser, kan jeg bruge enum?"

"Ja."

"Kan jeg erklære en enum i en klasse?"

"Ja."

"Og arve en enum?"

"Nej, du kan ikke arve en enum, og en enum kan ikke arve andre klasser."

"Hvorfor det?"

"Fordi Java-kompileren konverterer enums til omtrent dette:

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 fra dette eksempel:"

1) Direction-klassen arver absolut Enum-klassen, så den kan ikke arve andet.

2) Direction-klassen erklæres som endelig, så intet andet kan arve den.

3) Direction-klassens variabler er faktisk offentlige statiske endelige Direction-variable. Dette er tydeligt i kode, der bruger dem:

Retning retning = Retning .LEFT ;

4) Direction-klassen indeholder kun én konstruktør, og den er privat. Det betyder, at Direction-objekter kun kan oprettes ved hjælp af kode inde i klassen. Ud over de deklarerede objekter kan der ikke oprettes objekter.

5) Retningsvariabler kan tildeles en reference til et hvilket som helst af de eksisterende Retning-objekter. De er alle sat inden for enummet. Der er ingen andre objekter af denne type, og der vil ikke være andre i fremtiden.

6) Retningsobjekter kan sammenlignes ved at bruge «==», som blot vil udføre en simpel referencesammenligning."

"Jeg vil ikke sige, at det er superklart, men det er meget tydeligere efter dit eksempel."

"Fantastisk. Så er her lidt mere information til dig:"

1) Hvert Direction-objekt har sit eget unikke nummer. Den første (OP) er 0, den anden (NED) er 1, den tredje (VENSTRE) er 2 osv. Du kan få dette tal ved at bruge ordinal() metoden. "Se på skærmen:

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

2) Hver enum har en værdier () metode, der returnerer en matrix af enum's værdier.

int leftIndex = Direction.LEFT.ordinal();

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

"Det betyder, at vi kan få indekset for ethvert enum-element og derefter få elementet igen ved at bruge det indeks."

"Vi kan også bruge en enum i en foreach loop:"

for (Direction direction : Direction.values())
{
 System.out.println(direction);
}
Skærmudgang:
UP
DOWN
LEFT
RIGHT

"Betyder det, at enum tilsidesætter toString-metoden? Den viser trods alt ikke noget lignende:"
«com.codegym.Direction@123fd4»?

"Ja. Desuden kan hver enum, og derfor retning, konverteres til en streng og omvendt."

Konverter til en streng:
String left = Direction.LEFT.toString(); // left == "LEFT";
Konverter en streng til en enum:
Direction direction = Direction.valueOf("LEFT");

"Åh, forstår det."

"Hvad sker der, hvis du sender en streng til funktionen valueOf, der ikke er i Retning? For eksempel «AMIGO»?"

"Hvad synes du?"

"En undtagelse?"

"Jep. En UlovligArgumentundtagelse."

"Nå, det afslutter vores introduktion til enums verden."