CodeGym /Java blog /Véletlen /Enum osztály Java nyelven
John Squirrels
Szint
San Francisco

Enum osztály Java nyelven

Megjelent a csoportban
Szia! Ebben a cikkben a Java Enumsról fogunk beszélni . Képzelje el, hogy a következő feladatot kapta: hozzon létre egy osztályt, amely megvalósítja a hét napjait . Első pillantásra ez meglehetősen egyértelműnek tűnik. A kódod valahogy így nézne ki:

public class DayOfWeek {

   private String title;

   public DayOfWeek(String title) {
       this.title = title;
   }

   public static void main(String[] args) {
       DayOfWeek dayOfWeek = new DayOfWeek("Saturday");
       System.out.println(dayOfWeek);
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Úgy tűnik, minden rendben van, de van egy probléma: bármilyen szöveget átadhat a DayOfWeek osztály konstruktorának. Ez azt jelenti, hogy valaki létrehozhat egy "béka", "felhő" vagy "azaza322" nevű napot a héten. Nyilvánvalóan nem ezt a viselkedést várjuk el, mivel a hétnek csak 7 valódi napja van, és mindegyiknek külön neve van. Ezért az a feladatunk, hogy valamilyen módon korlátozzuk a DayOfWeek osztály lehetséges értéktartományát . A Java 1.5 megjelenése előtt a fejlesztőknek önállóan kellett kitalálniuk a saját megoldásaikat erre a problémára, mivel a nyelvnek nem volt kész megoldása. Abban az időben, ha a programozóknak korlátozniuk kellett az értékek számát, ezt tették:

public class DayOfWeek {

   private String title;

   private DayOfWeek(String title) {
       this.title = title;
   }

   public static DayOfWeek SUNDAY = new DayOfWeek("Sunday");
   public static DayOfWeek MONDAY = new DayOfWeek("Monday");
   public static DayOfWeek TUESDAY = new DayOfWeek("Tuesday");
   public static DayOfWeek WEDNESDAY = new DayOfWeek("Wednesday");
   public static DayOfWeek THURSDAY = new DayOfWeek("Thursday");
   public static DayOfWeek FRIDAY = new DayOfWeek("Friday");
   public static DayOfWeek SATURDAY = new DayOfWeek("Saturday");

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Íme, amit észre kell vennie:
  • A kivitelező magánszemély. Ha egy konstruktor meg van jelölve a privát módosítóval, akkor nem használható objektum létrehozására. És mivel az osztálynak csak egy konstruktora van, soha nem lehet DayOfWeek objektumot létrehozni.

    
    	public class Main {
    
       		public static void main(String[] args) {
          
           			DayOfWeek sunday = new DayOfWeek(); // Error!
       		}
    }
    

  • Természetesen az osztályban van a szükséges számú nyilvános statikus objektum, amelyek helyesen lettek inicializálva (a hét napjainak megfelelő megnevezésével).

    Ez lehetővé tette ezen objektumok más osztályokban való használatát.

    
    	public class Person {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = DayOfWeek.SUNDAY;
    
           			System.out.println(sunday);
      		 }
    }
    

    Kimenet:

    DayOfWeek{title = 'vasárnap'}

Ez a megközelítés nagyrészt megoldja a problémát. A hét 7 napja áll rendelkezésünkre, és senki sem tud újat létrehozni. Ezt a megoldást Joshua Bloch ajánlotta fel Hatékony Java című könyvében . Mellesleg, ez a könyv nagyon klassz, és minden Java-fejlesztőnek kötelező olvasmány. Az Enum osztály használata - 2A Java 1.5 kiadásával a nyelv kész megoldást kapott az ilyen helyzetekre: Java Enums . Az Enum a Java nyelven szintén egy osztály. Kifejezetten az ehhez hasonló problémák megoldására van "finomhangolva", azaz egy bizonyos korlátozott értéktartomány létrehozására. A Java készítőinek már voltak kész példái (például a C-nek már volt enum ), így meg tudták alkotni a legjobb változatot.

Tehát mi az a Java Enum?

Nézzük újra a DayOfWeek példánkat:

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Ez most sokkal egyszerűbbnek tűnik :) Belsőleg az Enumunknak 7 statikus állandója van. És ez az, amit egy program megvalósítására használhatunk. Például írjunk egy programot, amely meghatározza, hogy egy tanulónak ma iskolába kell-e mennie. Diákunknak napirendje lesz, amelyet a StudentSchedule osztály képvisel:

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Az ütemezési objektum dayOfWeek változója határozza meg, hogy melyik nap van ma. És íme a diákóránk:

public class Student {

   private StudentSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {
      
       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep more!");
       } else {
           System.out.println("Damn, time for school again :(");
       }
   }
}
A wakeUp() metódusban a Java Enum segítségével határozzuk meg, mit kell tennie a hallgatónak ezután. Nem is közöltünk részleteket a DayOfWeek egyes mezőiről , és nem is kell: nyilvánvaló, hogy a hét napjai hogyan működnek. Ha a jelenlegi formájában használjuk, minden fejlesztő megértené, mi történik a kódunkban. Egy másik példa az Enum kényelmére, hogy konstansai használhatók a switch utasítással. Például írjunk egy programot egy szigorú diétához, amelyben az ételeket napra ütemezzük:

public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday Dinner! You can even enjoy something a little sweet today.");
               break;
           case MONDAY:
               System.out.println("Lunch for Monday: chicken noodle soup!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today it's celery soup :(");
               break;
               //... and so on to the end
       }
   }
}
Ez az Enums egyik előnye a Java 1.5 előtt használt régi megoldással szemben – a régi megoldást nem lehetett kapcsolóval használni . Mit kell még tudni az Enumról ? Az Enum egy igazi osztály, minden lehetőséggel, amit ez magában rejt. Ha például a hét napjainak jelenlegi megvalósítása nem megfelelő, akkor változókat, konstruktorokat és metódusokat adhat hozzá a DayOfWeek-hez :

public enum DayOfWeek {
  
   SUNDAY ("Sunday"),
   MONDAY ("Monday"),
   TUESDAY ("Tuesday"),
   WEDNESDAY ("Wednesday"),
   THURSDAY ("Thursday"),
   FRIDAY ("Friday"),
   SATURDAY ("Saturday");

   private String title;

   DayOfWeek(String title) {
       this.title = title;
   }

   public String getTitle() {
       return title;
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Most az Enum konstansaink tartalmaznak egy címmezőt , gettert és felülírt toString metódust. A normál osztályokhoz képest az Enum egy komoly korlátozást jelentett : nem örökölhető. Ezenkívül a felsorolásoknak jellegzetes módszerei vannak:
  • value() : az Enum összes értékének tömbjét adja vissza :

    
    public static void main(String[] args) {
       		System.out.println(Arrays.toString(DayOfWeek.values()));
    }
    

    Kimenet:

    [DayOfWeek{title = 'Vasárnap'}, DayOfWeek{title = 'Hétfő'}, DayOfWeek{title = 'Kedd'}, DayOfWeek{title = 'Szerda'}, DayOfWeek{title = 'Csütörtök'}, Daytle =Hét 'Péntek'}, DayOfWeek{title = 'Szombat'}]

  • ordinal() : az állandó sorszámát adja vissza. A számozás nulláról indul:

    
    	public static void main(String[] args) {
    
       		int sundayIndex = DayOfWeek.SUNDAY.ordinal();
       		System.out.println(sundayIndex);
    }
    

    Kimenet:

    0

  • valueOf() : az átadott névnek megfelelő Enum objektumot adja vissza:

    
    public static void main(String[] args) {
       DayOfWeek sunday = DayOfWeek.valueOf("SUNDAY");
       System.out.println(sunday);
    }
    

    Kimenet:

    DayOfWeek{title = 'vasárnap'}

Jegyzet:nagybetűket használunk az Enum mezők megadására. Ezek konstansok, így a camelCase helyett csupa nagybetűt használnak .
Hozzászólások
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION