CodeGym /Blog Java /Aleatoriu /Clasa Enum în Java
John Squirrels
Nivel
San Francisco

Clasa Enum în Java

Publicat în grup
Bună! În acest articol vă vom spune despre Java Enums . Imaginați-vă că vi s-a dat următoarea sarcină: creați o clasă care implementează zilele săptămânii . La prima vedere, acest lucru pare destul de simplu. Codul tău ar arăta cam așa:

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 + '\'' +
               '}';
   }
}
Totul pare să fie în regulă, dar există o problemă: puteți trece orice text constructorului clasei DayOfWeek . Asta înseamnă că cineva ar putea crea o zi a săptămânii numită „Broacă”, „Nor” sau „azaza322”. În mod clar, acesta nu este comportamentul la care ne așteptăm, deoarece există doar 7 zile reale pe săptămână și fiecare dintre ele are un nume specific. Prin urmare, sarcina noastră este să limităm cumva gama de valori posibile pentru clasa DayOfWeek . Înainte de apariția Java 1.5, dezvoltatorii au trebuit să-și inventeze în mod independent propriile soluții la această problemă, deoarece limbajul nu avea o soluție gata făcută. În acele zile, dacă programatorii trebuiau să limiteze numărul de valori, făceau asta:

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 + '\'' +
               '}';
   }
}
Iată ce ar trebui să observați:
  • Constructorul este privat. Dacă un constructor este marcat cu modificatorul privat , acesta nu poate fi folosit pentru a crea un obiect. Și, deoarece clasa are un singur constructor, niciun obiect DayOfWeek nu poate fi creat vreodată.

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

  • Desigur, clasa are numărul necesar de obiecte statice publice , care au fost inițializate corect (folosind numele corecte ale zilelor săptămânii).

    Acest lucru a permis ca aceste obiecte să fie folosite în alte clase.

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

    Ieșire:

    Ziua Săptămânii{title = 'Duminică'}

Această abordare rezolvă în mare măsură problema. Avem la dispoziție 7 zile din săptămână și nimeni nu poate crea altele noi. Această soluție a fost oferită de Joshua Bloch în cartea sa Effective Java . Apropo, acea carte este foarte tare și o citire obligatorie pentru orice dezvoltator Java. Cum se utilizează clasa Enum - 2Odată cu lansarea Java 1.5, limbajul a câștigat o soluție gata făcută pentru astfel de situații: Java Enums . Enum în Java este, de asemenea, o clasă. Este special „ajustat” pentru rezolvarea unor probleme de genul acesta, adică crearea unui anumit interval limitat de valori. Creatorii Java aveau deja exemple gata (de exemplu, C avea deja enum ), așa că au putut crea cea mai bună variantă.

Deci, ce este Java Enum?

Să revedem exemplul nostru DayOfWeek :

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Acum pare mult mai simplu :) Pe plan intern, Enum- ul nostru are 7 constante statice. Și asta e ceva pe care îl putem folosi pentru a implementa un program. De exemplu, să scriem un program care determină dacă un elev trebuie să meargă astăzi la școală. Studentul nostru va avea un program zilnic, reprezentat de clasa StudentSchedule :

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Variabila dayOfWeek a obiectului de planificare determină ziua care este astăzi. Și iată clasa noastră de studenți:

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 :(");
       }
   }
}
În metoda wakeUp() , folosim Java Enum pentru a determina ce ar trebui să facă studentul în continuare. Nici măcar nu am oferit detalii despre fiecare câmp din DayOfWeek și nu este nevoie: este evident cum ar trebui să funcționeze zilele săptămânii. Dacă îl folosim în forma sa actuală, orice dezvoltator ar înțelege ce se întâmplă în codul nostru. Un alt exemplu de comoditate a lui Enum este că constantele sale pot fi utilizate cu instrucțiunea switch. De exemplu, să scriem un program pentru o dietă strictă, în care felurile de mâncare sunt programate pe zi:

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
       }
   }
}
Acesta este unul dintre avantajele Enums față de vechea soluție folosită înainte de Java 1.5 — vechea soluție nu putea fi utilizată cu switch . Ce altceva trebuie să știi despre Enum ? Enum este o adevărată clasă cu toate posibilitățile pe care aceasta le presupune. De exemplu, dacă implementarea curentă a zilelor săptămânii este inadecvată, puteți adăuga variabile, constructori și metode la DayOfWeek :

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 + '\'' +
               '}';
   }
}
Acum constantele noastre Enum au un câmp de titlu , getter și metoda toString suprascrisă. În comparație cu clasele obișnuite, o limitare serioasă a fost pusă pe Enum - nu poate fi moștenită. În plus, enumerările au metode caracteristice:
  • values() : returnează o matrice a tuturor valorilor din Enum :

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

    Ieșire:

    [DayOfWeek{title = 'Sunday'}, DayOfWeek{title = 'Monday'}, DayOfWeek{title = 'Tuesday'}, DayOfWeek{title = 'Wednesday'}, DayOfWeek{title = 'Thursday'}, DayOfWeek{title = „Friday”}, DayOfWeek{title = „Sâmbătă”}]

  • ordinal() : returnează numărul ordinal al constantei. Numerotarea începe de la zero:

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

    Ieșire:

    0

  • valueOf() : returnează obiectul Enum care corespunde numelui transmis:

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

    Ieșire:

    Ziua Săptămânii{title = 'Duminică'}

Notă:folosim litere mari pentru a specifica câmpurile Enum . Acestea sunt constante, așa că folosesc majuscule mai degrabă decât camelCase .
Comentarii
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION