JavaRush /Java-Blog /Random-DE /Enum in Java: So verwenden Sie die Klasse

Enum in Java: So verwenden Sie die Klasse

Veröffentlicht in der Gruppe Random-DE
Hallo! In diesem Artikel werde ich Ihnen etwas über Java Enums erzählen. Stellen Sie sich vor, Sie hätten eine Aufgabe erhalten: Erstellen Sie eine Klasse, die die Wochentage implementiert . Auf den ersten Blick ist das nicht kompliziert und Ihr Code sieht in etwa so aus:
public class DayOfWeek {

   private String title;

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

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

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Und alles scheint in Ordnung zu sein, aber es gibt ein Problem: Sie können einen beliebigen Text an den Konstruktor der DayOfWeek- Klasse übergeben. Auf diese Weise kann jemand den Wochentag „Frosch“, „Wolke“ oder „azaza322“ erstellen. Dies ist eindeutig nicht das Verhalten, das wir erwarten, da es nur sieben echte Wochentage gibt und jeder von ihnen einen Namen hat. Daher besteht unsere Aufgabe darin, den Bereich möglicher Werte für die Klasse „ Wochentag “ irgendwie einzuschränken . Vor Java 1.5 waren Entwickler gezwungen, selbst eine Lösung für dieses Problem zu finden, da es in der Sprache selbst keine fertige Lösung gab. Wenn die Situation damals eine begrenzte Anzahl von Werten erforderte, ging man folgendermaßen vor:
public class DayOfWeek {

   private String title;

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

   public static DayOfWeek SUNDAY = new DayOfWeek("Sonntag");
   public static DayOfWeek MONDAY = new DayOfWeek("Montag");
   public static DayOfWeek TUESDAY = new DayOfWeek("Dienstag");
   public static DayOfWeek WEDNESDAY = new DayOfWeek("Mittwoch");
   public static DayOfWeek THURSDAY = new DayOfWeek("Donnerstag");
   public static DayOfWeek FRIDAY = new DayOfWeek("Freitag");
   public static DayOfWeek SATURDAY = new DayOfWeek("Samstag");

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Worauf Sie hier achten sollten:
  • Privater Konstrukteur. Wenn ein Konstruktor mit dem privaten Modifikator markiert ist , kann mit diesem Konstruktor kein Objekt der Klasse erstellt werden. Und da es in dieser Klasse nur einen Konstruktor gibt, kann das DayOfWeek- Objekt überhaupt nicht erstellt werden.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//Fehler!
       		}
    }
  • Gleichzeitig enthielt die Klasse die erforderliche Anzahl öffentlicher statischer Objekte, die auf die von uns benötigte Weise initialisiert wurden (die Namen der Tage sind korrekt).

    Dadurch war es möglich, Objekte in anderen Klassen zu verwenden.

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

    Abschluss:

    DayOfWeek{title='Sunday'}

Mit diesem Ansatz konnten wir das Problem weitgehend lösen. Wir hatten 7 Tage in der Woche zur Verfügung und niemand konnte neue schaffen. Diese Lösung wurde von Joshua Bloch im Buch Effective Java vorgeschlagen . Das Buch ist übrigens sehr cool und ein Muss für jeden Java-Entwickler.
So verwenden Sie die Enum-Klasse – 2
Mit der Veröffentlichung von Java 1.5 führte die Sprache eine fertige Lösung für solche Situationen ein – die Enum- Enumeration . Enum ist auch eine Klasse. Aber es ist speziell „zugeschnitten“, um ähnliche Probleme wie unseres zu lösen: die Schaffung eines bestimmten begrenzten Wertebereichs. Da die Entwickler von Java bereits über vorgefertigte Beispiele verfügten (z. B. die C-Sprache, in der Enum bereits existierte), konnten sie die optimale Option erstellen.

Was ist Enumeration?

Was ist Enum in Java ? Schauen wir uns das Beispiel desselben DayOfWeek an :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Es sieht schon viel einfacher aus :) In unserem Enum gibt es 7 Konstanten mit statischem Zugriff. Wir können es bereits verwenden, um Logik im Programm zu implementieren. Schreiben wir zum Beispiel ein Programm, das ermittelt, ob ein Schüler heute zur Schule gehen muss. Unser Schüler wird seinen eigenen Tagesablauf haben, der von der ScholarSchedule- Klasse festgelegt wird :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...andere Felder


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Die Variable dayOfWeek im Tagmodus bestimmt, welcher Tag es ist. Und hier ist die Klasse unseres Schülers:
public class Scholar {

   private ScholarSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {

       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println(„Hurra, du kannst noch etwas schlafen!“);
       } else {
           System.out.println(„Verdammt, zurück zur Schule :(“);
       }
   }
}
In der Methode wakeUp() ermitteln wir mithilfe von Enum die weiteren Aktionen des Schülers. Wir haben nicht einmal im Detail beschrieben, was jede Variable in DayOfWeek bedeutet , und das ist auch nicht notwendig: Der Mechanismus der Wochentage ist bereits offensichtlich, und wenn wir ihn in seiner aktuellen Form verwenden, wird jeder Entwickler verstehen, was passiert in Ihrem Code. Ein weiteres Beispiel für die Bequemlichkeit von Enum ist, dass seine Konstanten mit einer Switch-Anweisung verwendet werden können . Wir schreiben zum Beispiel ein Programm für eine strenge Diät, bei dem die Mahlzeiten nach Tagen geplant werden:
public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println(„Sonntagsmittagessen! Heute darf es sogar etwas Süßes geben“);
               break;
           case MONDAY:
               System.out.println(„Montagmittag: Hühnernudeln!“);
               break;
           case TUESDAY:
               System.out.println(„Dienstag, heute gibt es Selleriesuppe :(“);
               break;
               //...und so weiter bis zum Ende
       }
   }
}
Dies ist einer der Vorteile von Enum gegenüber der alten Lösung, die vor Java 1.5 verwendet wurde: Die alte Lösung konnte nicht mit switch verwendet werden .

Was müssen Sie sonst noch über die Enum-Klasse wissen?

Die Enum-Klasse ist eine echte Klasse mit allen damit verbundenen Funktionen. Wenn Ihnen beispielsweise die aktuelle Implementierung von Wochentagen nicht ausreicht, können Sie Variablen, Konstruktoren und Methoden zu DayOfWeek hinzufügen:
public enum DayOfWeek {

   SUNDAY ("Sonntag"),
   MONDAY ("Montag"),
   TUESDAY ("Dienstag"),
   WEDNESDAY ("Mittwoch"),
   THURSDAY ("Donnerstag"),
   FRIDAY ("Freitag"),
   SATURDAY ("Samstag");

   private String title;

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

   public String getTitle() {
       return title;
   }

   @Override
   public String toString() {
       return "DayOfWeek{" +
               "title='" + title + '\'' +
               '}';
   }
}
Die Konstanten unserer Enum verfügen jetzt über ein Titelfeld , einen Getter und eine überschriebene toString- Methode . Im Vergleich zu regulären Klassen weist Enum eine gravierende Einschränkung auf: Es kann nicht von dieser Klasse geerbt werden. Darüber hinaus verfügen Aufzählungen über einzigartige Methoden:
  • Werte() : Gibt ein Array aller im Enum gespeicherten Werte zurück :

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

    Abschluss:

    [DayOfWeek{title='Sunday'}, DayOfWeek{title='Monday'}, DayOfWeek{title='Tuesday'}, DayOfWeek{title='Wednesday'}, DayOfWeek{title='Thursday'}, DayOfWeek{title= 'Friday'}, DayOfWeek{title='Saturday'}]

  • ordinal() : gibt die Ordnungszahl einer Konstante zurück. Der Countdown beginnt bei Null:

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

    Abschluss:

    0

  • valueOf() : Gibt ein Enum- Objekt zurück , das dem angegebenen Namen entspricht:

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

    Abschluss:

    DayOfWeek{title='Sunday'}

Passt auf:Wir schreiben die Namen von Enum- Elementen groß , da sie Konstanten sind und als solche bezeichnet werden, nicht camelCase .
Kommentare
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION