Java - enums klasa


U ovoj lekciji ćemo naučiti o nabrajanjima u Javi. Naučićemo stvarati i koristiti enums i enum klase uz pomoć primjera. U Javi, enum (skraćeno od enumeration) je tip koji ima fiksni skup konstantnih vrijednosti. Koristimo ključnu riječ enum za deklaraciju enuma. Pogledajmo primjer:

enum Size { 
   SMALL, MEDIUM, LARGE, EXTRALARGE 
}

Ovdje smo stvorili popis s imenom Size. Sadrži fiksne vrijednosti SMALL, MEDIUM, LARGE i EXTRALARGE. Ove vrijednosti unutar zagrada nazivaju se enum konstante (vrijednosti) (enum constants (values)).


Primjer 1: Java Enum

enum Size {
   SMALL, MEDIUM, LARGE, EXTRALARGE
}

class Main {
   public static void main(String[] args) {
      System.out.println(Size.SMALL);
      System.out.println(Size.MEDIUM);
   }
}

Prikaz koda iz gornjeg primjera izgledaće ovako:

SMALL
MEDIUM

Kao što možemo vidjeti iz gornjeg primjera, koristimo ime nabrajanja za pristup konstantnim vrijednostima. Takođe, možemo kreirati promjenjljive tipove enuma. Pogledajmo primjer:

Size pizzaSize;

Ovdje je pizzaSize varijabla tipa Size. Modu mu se dodijeliti samo 4 vrijednosti.

pizzaSize = Size.SMALL;
pizzaSize = Size.MEDIUM;
pizzaSize = Size.LARGE;
pizzaSize = Size.EXTRALARGE;

Primjer 2: Java Enum s naredbom switch

enum Size {
 SMALL, MEDIUM, LARGE, EXTRALARGE
}

class Test {
 Size pizzaSize;
 public Test(Size pizzaSize) {
   this.pizzaSize = pizzaSize;
 }
 public void orderPizza() {
   switch(pizzaSize) {
     case SMALL:
       System.out.println("Naručio sam pizzu male veličine.");
       break;
     case MEDIUM:
       System.out.println("Naručio sam pizzu srednje veličine.");
       break;
     default:
       System.out.println("Ne znam koju da naručim.");
       break;
   }
 }
}

class Main {
 public static void main(String[] args) {
   Test t1 = new Test(Size.MEDIUM);
   t1.orderPizza();
 }
}

Prikaz koda iz gornjeg primjera izgledaće ovako:

Naručio sam pizzu srednje veličine.

U gore navedenom programu stvorili smo enum tip Size. Zatim smo deklarisali varijablu pizzaSize tipa Size. Ovdje se varijabli pizzaSize mogu dodijeliti samo 4 vrijednosti (SMALL, MEDIUM, LARGE, EXTRALARGE). Obratite pažnju na izjavu:

Test t1 = new Test(Size.MEDIUM);

Pozvaće konstruktor Test() unutar klase Test. Sada se varijabli pizzaSize dodjeljuje MEDIUM konstanta. Na osnovu vrijednosti izvršava se jedan od slučajeva naredbe switch case.



Enum klasa u Javi

U Javi se tipovi nabrajanja smatraju posebnom vrstom klase. Predstavljen je izdanjem Java 5. Enum klasa može uključivati metode i polja kao i obična klasa.

enum Size {
    constant1, constant2, …, constantN;

    // Metode i polja  
}

Kada kreiramo enum klasu, kompajler će stvoriti instance (objekte) svake enum konstante. Takođe, konstanta enuma je prema zadanim postavkama uvijek public static final.


Primjer 3: Java Enum klase

enum Size{
  SMALL, MEDIUM, LARGE, EXTRALARGE;

  public String getSize() {

    // Ovo će se odnositi na objekt SMALL
    switch(this) {
      case SMALL:
        return "mala";

      case MEDIUM:
        return "srednja";

      case LARGE:
        return "velika";

      case EXTRALARGE:
        return "extra velika";

      default:
        return null;
      }
   }

  public static void main(String[] args) {

    // Pozivanje metode getSize()
    // Korištenje objekta SMALL
    System.out.println("Veličina pizze je: " + Size.SMALL.getSize());
  }
}

U gornjem primjeru stvorili smo enum klasu Size. Ima četiri konstante SMALL, MEDIUM, LARGE i EXTRALARGE. Pošto je Size klasa nabrajanja, kompajler automatski stvara instance za svaku konstantu nabrajanja. Ovdje unutar metode main() koristili smo instancu SMALL za pozivanje metode getSize().



Metode Java Enum klase

Postoje neke unaprijed definisane metode u enum klasama koje su lako dostupne za upotrebu.


1. Java Enum ordinal()

Metoda ordinal() vraća položaj enum konstante. Pogledajmo primjer:

ordinal(SMALL) 
// Vraća - returns 0

2. Enum compareTo()

Metoda compareTo() upoređuje enum konstante na osnovu njihove redne vrijednosti. Pogledajmo primjer:

Size.SMALL.compareTo(Size.MEDIUM)
 // Vraća - returns ordinal(SMALL) - ordinal(MEDIUM)

3. Enum toString()

Metoda toString() vraća string prikaz enum konstanti. Pogledajmo primjer:

SMALL.toString()
// Vraća - returns "SMALL"

4. Enum name()

Metoda name() vraća definisano ime enum konstante u obliku stringa. Vraćena vrijednost iz metode name() je final. Pogledajmo primjer:

name(SMALL)
// Vraća - returns "SMALL"

5. Java Enum valueOf()

Metoda valueOf() uzima string i vraća enum konstantu koja ima isto ime stringa. Pogledajmo primjer:

Size.valueOf("SMALL")
// Vraća - returns constant SMALL.

6. Enum values()

Metoda values() vraća niz tipa enum koji sadrži sve enum konstante. Pogledajmo primjer:

Size[] enumArray = Size.value();


Zašto Java Enums?

U Javi je enum uveden kako bi zamijenio upotrebu int konstanti. Pretpostavimo da smo koristili zbirku int konstanti.

class Size {
   public final static int SMALL = 1;
   public final static int MEDIUM = 2;
   public final static int LARGE = 3;
   public final static int EXTRALARGE = 4;
}

Ovdje problem nastaje ako ispišemo konstante. To je zato što se ispisuje samo broj koji možda ne bi bio od pomoći. Dakle, umjesto da koristimo int konstante, možemo jednostavno koristiti enume. Pogledajmo primjer:

enum Size {
   SMALL, MEDIUM, LARGE, EXTRALARGE
}

Ovo čini naš kod intuitivnijim. Takođe, enum pruža sigurnost tipa prevođenja. Ako deklarišemo varijablu tipa Size. Pogledajmo primjer:

Size size;

Ovdje je zagarantovano da će varijabla da sadržai jednu od četiri vrijednosti. Sada, ako pokušamo prenijeti vrijednosti koje nisu te četiri vrijednosti, kompajler će generisati grešku.