Enum og alle dens funksjoner - 1

"Hei, Amigo!"

"Hei, Amigo!"

"Jeg skal fortelle deg om noe veldig interessant. Det er ganske enkelt, men det gjør det enda mer interessant. Det kalles en enum. En enum er en type som definerer det spesifikke settet med verdier som en variabel kan ha. La oss se ved et eksempel rett ut:"

Definisjon av en enum-klasse
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}
Ved hjelp av en enum
Direction direction = Direction.LEFT;

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

"Så vi bare lister opp et sett med verdier og det er det?"

"Ja, vi erklærer en enum og viser alle dens mulige verdier inni, atskilt med et komma."

"Det er også ganske enkelt å bruke."

"Kan du sette den til null?"

"Ja, en enum er en vanlig klasse, eller rettere sagt, det er litt som en klasse, lik hvordan grensesnitt er som klasser."

"Så hvor enn jeg kan bruke klasser, kan jeg bruke enum?"

"Ja."

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

"Ja."

"Og arve en enum?"

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

"Hvorfor det?"

"Fordi Java-kompilatoren 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 eksemplet:"

1) Direction-klassen arver absolutt Enum-klassen, så den kan ikke arve noe annet.

2) Direction-klassen er erklært som endelig, så ingenting annet kan arve den.

3) Direction-klassens variabler er faktisk offentlige statiske sluttretningsvariabler. Dette er tydelig i kode som bruker dem:

Retning retning = Retning .VENSTRE ;

4) Direction-klassen inneholder bare én konstruktør og den er privat. Det betyr at Direction-objekter kun kan opprettes ved å bruke kode inne i klassen. Utenom de deklarerte objektene kan ingen objekter opprettes.

5) Retningsvariabler kan tilordnes en referanse til alle de eksisterende retningsobjektene. De er alle satt innenfor enumen. Det er ingen andre objekter av denne typen, og det vil ikke være noen andre i fremtiden.

6) Retningsobjekter kan sammenlignes med «==», som bare vil utføre en enkel referansesammenligning."

"Jeg vil ikke si at det er superklart, men det er mye klarere etter ditt eksempel."

"Flott. Så her er litt mer informasjon til deg:"

1) Hvert Direction-objekt har sitt eget unike nummer. Den første (OPP) er 0, den andre (NED) er 1, den tredje (VENSTRE) er 2, osv. Du kan få dette tallet ved å bruke ordinal()-metoden. "Se på skjermen:

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

2) Hver enum har en verdier ()-metode som returnerer en rekke av enum-verdiene.

int leftIndex = Direction.LEFT.ordinal();

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

"Dette betyr at vi kan få indeksen til et hvilket som helst enum-element, og deretter få elementet igjen ved å bruke den indeksen."

"Vi kan også bruke en enum i en hver løkke:"

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

"Betyr det at enum overstyrer toString-metoden? Tross alt viser den ikke noe slikt som:"
«com.codegym.Direction@123fd4»?

"Ja. Dessuten kan hver enum, og derfor retning, konverteres til en streng og vice versa."

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

"Å, skjønner det."

"Hva skjer hvis du sender en streng til funksjonen valueOf som ikke er i retning? For eksempel «AMIGO»?"

"Hva tror du?"

"Et unntak?"

"Jepp. Et ulovlig argumentunntak."

"Vel, det avslutter vår introduksjon til enums verden."