Enum és minden funkciója - 1

– Szia Amigo!

– Szia Amigo!

"Elmesélek neked valami nagyon érdekeset. Elég egyszerű, de ettől még érdekesebb. Ezt enumnak hívják. Az enum egy olyan típus, amely meghatározza azt a konkrét értékkészletet, amellyel egy változó rendelkezhet. Nézzük meg rögtön egy példában:"

Az enum osztály meghatározása
public enum Direction
{
 UP,
 DOWN,
 LEFT,
 RIGHT,
}
Egy enum segítségével
Direction direction = Direction.LEFT;

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

– Tehát csak felsorolunk egy értékkészletet, és kész?

"Igen, deklarálunk egy enumot, és benne felsoroljuk az összes lehetséges értékét, vesszővel elválasztva."

– Használata is meglehetősen egyszerű.

– Be tudod állítani nullára?

"Igen, az enum egy rendes osztály, vagy inkább olyan, mint egy osztály, hasonlóan ahhoz, ahogy az interfészek olyanok, mint az osztályok."

"Tehát ahol használhatok osztályokat, használhatok enumot?"

"Igen."

– Deklarálhatok enumot egy osztályon belül?

"Igen."

– És örököl egy enumot?

"Nem, nem örökölhetsz enumot, és egy enum nem örökölhet más osztályokat."

"Miert van az?"

"Mivel a Java fordító az enumokat körülbelül erre konvertálja:

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
}

"Amint ebből a példából látható:"

1) A Direction osztály abszolút örökli az Enum osztályt, tehát nem örökölhet mást.

2) Az Irány osztály véglegesnek van nyilvánítva, így semmi más nem örökölheti.

3) Az Irány osztály változói valójában nyilvános statikus végső Irányváltozók. Ez nyilvánvaló az őket használó kódban:

Irány irány = Irány .BAL ;

4) A Direction osztály csak egy konstruktort tartalmaz, és ez privát. Ez azt jelenti, hogy Direction objektumok csak az osztályon belüli kód használatával hozhatók létre. A deklarált objektumok kivételével semmilyen objektum nem hozható létre.

5) Az irányváltozók bármely meglévő Irány objektumhoz hozzárendelhetők hivatkozás. Mindegyik az enumban van beállítva. Nincsenek más ilyen típusú tárgyak, és a jövőben sem lesznek.

6) Az irányobjektumok összehasonlíthatók a «==» használatával, amely csak egy egyszerű referencia-összehasonlítást hajt végre."

– Nem mondanám, hogy szuper egyértelmű, de a példád után sokkal világosabb.

"Remek. Akkor itt van még egy kis információ:"

1) Minden Direction objektumnak megvan a maga egyedi száma. Az első (UP) 0, a második (DOWN) 1, a harmadik (LEFT) 2 stb. Ezt a számot az ordinal() metódussal kaphatja meg. "Nézd a képernyőt:

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

2) Minden enum rendelkezik egy értékek () metódussal, amely az enum értékeinek tömbjét adja vissza.

int leftIndex = Direction.LEFT.ordinal();

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

"Ez azt jelenti, hogy lekérhetjük bármely enum elem indexét, majd az index segítségével újra megkaphatjuk az elemet."

"Használhatunk enumot is a foreach ciklusban:"

for (Direction direction : Direction.values())
{
 System.out.println(direction);
}
Képernyő kimenet:
UP
DOWN
LEFT
RIGHT

"Ez azt jelenti, hogy az enum felülírja a toString metódust? Végül is nem jelenít meg semmi ilyesmit:"
«com.codegym.Direction@123fd4»?

"Igen. Sőt, minden enum, és így az Irány is átalakítható Stringgé és fordítva."

Konvertálás karakterláncsá:
String left = Direction.LEFT.toString(); // left == "LEFT";
Karakterlánc átalakítása enummá:
Direction direction = Direction.valueOf("LEFT");

– Ó, értem.

"Mi történik, ha olyan karakterláncot ad át a valueOf függvénynek, amely nem a Directionban van? Például: «AMIGO»?"

"Mit gondolsz?"

"Egy kivétel?"

"Igen. IllegalArgumentException."

– Nos, ezzel véget is értünk az enumok világába való bevezetésünknek.