Java enumeracija: mali enum, elegantan i čist
TENNIS", 0); FOOTBALL = new PlayerType("FOOTBALL", 1); BASKETBALL = new PlayerType("BASKETBALL", 2); $VALUES = (new PlayerType[] { TENNIS, FOOTBALL, BASKETBALL }); } }
„Videli ste? Java kompajler je za nas uradio mnogo implicitnog rada, inače ručno pisanje enumeracije ne bi bilo tako lako i jednostavno.“
- Treba naslediti Enum klasu;
- Treba pisati konstruktorsku metodu;
- Treba deklarisati statičke promenljive i nizove;
- Treba koristiti statički blok za inicijalizaciju statičkih promenljivih i nizova;
- Treba pružiti statičke metode, na primer `values()` i `valueOf(String name)`.
„Zaista, kao programeri, naša količina koda je smanjena, enumeracija izgleda jednostavno i jasno.“ Sanmej je rekla.
„Budući da je enumeracija specijalna klasa, ona se zapravo može definisati unutar jedne klase, time njen opseg može biti ograničen na korišćenje u ovoj spoljnoj klasi.“ rekao sam.
```java
public class Player {
private PlayerType type;
public enum PlayerType {
TENNIS,
FOOTBALL,
BASKETBALL
}
public boolean isBasketballPlayer() {
return getType() == PlayerType.BASKETBALL;
}
public PlayerType getType() {
return type;
}
public void setType(PlayerType type) {
this.type = type;
}
}PlayerType je ekvivalent unutrašnjoj klasi Player-a.
Budući da je enumeracija final, može se osigurati da postoji samo jedan konstantni objekat u Java virtuelnoj mašini, na osnovu ovog razloga, možemo koristiti „==" operator za poređenje da li su dve enumeracije jednake, videti isBasketballPlayer() metodu.
„Zašto ne koristiti equals() metodu za sudiju?" Sanmej je pitala.
if(player.getType().equals(Player.PlayerType.BASKETBALL)){};„Objasniću ti.“
„==" operator pri poređenju, ako su oba objekta null, neće desiti NullPointerException, dok equals() metoda hoće.
Pored toga, „==" operator se proverava pri kompajliranju, ako se tipovi na obe strane ne podudaraju, prikazaće grešku, dok equals() metoda neće.

„Enumeracija se takođe može koristiti u switch izrazu, upotreba je ista kao i osnovni tipovi podataka.“ rekao sam.
switch (playerType) {
case TENNIS:
return "Teniser Federer";
case FOOTBALL:
return "Fudbaler Cristiano Ronaldo";
case BASKETBALL:
return "Košarkaš Lebron James";
case UNKNOWN:
throw new IllegalArgumentException("Nepoznat");
default:
throw new IllegalArgumentException(
"Tip sporta: " + playerType);
}„Ako enumeracija treba da sadrži više informacija, možete joj dodati neka polja, na primer name u sledećem primeru, u ovom trenutku treba dodati konstruktor sa parametrima za enumeraciju, time možete dodati odgovarajuće ime pri definisanju enumeracije.“ nastavio sam.
public enum PlayerType {
TENNIS("Tenis"),
FOOTBALL("Fudbal"),
BASKETBALL("Košarka");
private String name;
PlayerType(String name) {
this.name = name;
}
}Košarkaš"); enumMap.put(PlayerType.FOOTBALL,"Fudbaler"); enumMap.put(PlayerType.TENNIS,"Teniser"); System.out.println(enumMap);
System.out.println(enumMap.get(PlayerType.BASKETBALL)); System.out.println(enumMap.containsKey(PlayerType.BASKETBALL)); System.out.println(enumMap.remove(PlayerType.BASKETBALL));
„Pogledajmo rezultat izlaza.“{TENNIS=Teniser, FOOTBALL=Fudbaler, BASKETBALL=Košarkaš} Košarkaš true Košarkaš
„Pored ovoga, u knjizi „Effective Java“ se takođe pominje jedna tačka, ako treba implementirati singleton, najbolje je koristiti način enumeracije.“ rekao sam.
„Čekaj Erge, šta je singleton?“ Sanmej je brzo upitala bez nego sam nastavio.
„Singleton (Singleton) služi za osiguravanje da klasa ima samo jedan objekat, i pruža globalnu tačku pristupa za pristup, u jednom procesu. Zato što ova klasa ima samo jedan objekat, ne može se više koristiti `new` ključna reč za kreiranje novih objekata.“
„Java standardna biblioteka ima neke klase koje su singleton, na primer Runtime ova klasa.“
```java
Runtime runtime = Runtime.getRuntime();„Runtime klasa može koristiti za dobavljanje okruženja izvršavanja Java programa.“
„O singleton-u, shvatio si malo?“ sam pitao
„Ohhhhh.“ Sanmej je kimnula glavom.
„Uobičajeno, implementiranje singleton-a nije lako, pogledajte sledeći način pisanja.“
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}„Treba koristiti volatile, synchronized ključne reči itd., ali pojava enumeracije, smanjuje količinu koda na ekstrem.“
public enum EasySingleton{
INSTANCE;
}„Samo to?“ Sanmej je široko otvorila oči.
„Da, enumeracija podrazumevano implementira Serializable interfejs, stego Java virtuelna mašina može garantovati da je ova klasa singleton, ovo se razlikuje od tradicionalnih načina implementacije. U tradicionalnim načinima, moramo osigurati da se pri deserializaciji ne kreira novi primerak.“ rekao sam.
„Dobro, o enumeraciji ću reći toliko, ručno upiši ovaj kod!“
„Dobro, odmah sređujem. Erge, možeš ode na odmor.“
„Mmm.“ Posle toliko govora, moram da trčim do raspeća da zapalim jednu Huazi cigaretu.
