CodeGym /Java Blog /Willekeurig /Enum-klasse in Java
John Squirrels
Niveau 41
San Francisco

Enum-klasse in Java

Gepubliceerd in de groep Willekeurig
Hoi! In dit artikel gaan we je vertellen over Java Enums . Stel je voor dat je de volgende taak hebt gekregen: maak een klas die de dagen van de week implementeert . Op het eerste gezicht lijkt dit vrij eenvoudig. Je code zou er ongeveer zo uitzien:

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 + '\'' +
               '}';
   }
}
Alles lijkt in orde te zijn, maar er is één probleem: je kunt elke tekst doorgeven aan de constructor van de klasse DayOfWeek . Dat betekent dat iemand een dag van de week kan maken met de naam "Frog", "Cloud" of "azaza322". Dit is duidelijk niet het gedrag dat we verwachten, aangezien er maar 7 echte dagen van de week zijn, en elk daarvan heeft een specifieke naam. Daarom is het onze taak om op de een of andere manier het bereik van mogelijke waarden voor de DayOfWeek- klasse te beperken. Voordat Java 1.5 op de markt kwam, moesten ontwikkelaars zelfstandig hun eigen oplossingen voor dit probleem bedenken, aangezien de taal geen kant-en-klare oplossing had. Als programmeurs in die tijd het aantal waarden moesten beperken, deden ze dit:

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 + '\'' +
               '}';
   }
}
Dit is wat u zou moeten opmerken:
  • De constructeur is privé. Als een constructor is gemarkeerd met de private modifier, kan deze niet worden gebruikt om een ​​object te maken. En aangezien de klasse maar één constructor heeft, kunnen er nooit DayOfWeek- objecten worden gemaakt.

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

  • Natuurlijk heeft de klasse wel het vereiste aantal openbare statische objecten, die correct zijn geïnitialiseerd (met de juiste namen van de dagen van de week).

    Hierdoor konden deze objecten in andere klassen worden gebruikt.

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

    Uitgang:

    DayOfWeek{title = 'Zondag'}

Deze aanpak lost het probleem grotendeels op. We hebben 7 dagen van de week tot onze beschikking en niemand kan nieuwe dagen aanmaken. Deze oplossing werd aangereikt door Joshua Bloch in zijn boek Effectief Java . Trouwens, dat boek is erg cool en een must-read voor elke Java-ontwikkelaar. Hoe de Enum-klasse te gebruiken - 2Met de release van Java 1.5 kreeg de taal een kant-en-klare oplossing voor dergelijke situaties: Java Enums . Enum in Java is ook een klasse. Het is speciaal "afgesteld" om dit soort problemen op te lossen, dwz een bepaald beperkt waardenbereik te creëren. De makers van Java hadden al kant-en-klare voorbeelden (C had bijvoorbeeld al enum ), dus konden ze de beste variant maken.

Dus wat is Java Enum?

Laten we ons DayOfWeek- voorbeeld opnieuw bekijken:

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Nu ziet dat er een stuk eenvoudiger uit :) Intern heeft onze Enum 7 statische constanten. En dat is iets wat we kunnen gebruiken om een ​​programma te implementeren. Laten we bijvoorbeeld een programma schrijven dat bepaalt of een leerling vandaag naar school moet. Onze student heeft een dagelijks schema, vertegenwoordigd door de StudentSchedule- klas:

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
De variabele dayOfWeek van het schedule-object bepaalt welke dag vandaag is. En hier is onze studentenklas:

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 :(");
       }
   }
}
Bij de methode wakeUp() gebruiken we Java Enum om te bepalen wat de leerling vervolgens moet doen. We hebben niet eens details gegeven over elk veld in DayOfWeek , en dat is ook niet nodig: het is duidelijk hoe de dagen van de week zouden moeten werken. Als we het in zijn huidige vorm gebruiken, zou elke ontwikkelaar begrijpen wat er in onze code gebeurt. Een ander voorbeeld van het gemak van Enum is dat de constanten kunnen worden gebruikt met de switch-instructie. Laten we bijvoorbeeld een programma schrijven voor een streng dieet, waarin gerechten per dag worden gepland:

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
       }
   }
}
Dit is een van de voordelen van Enum ten opzichte van de oude oplossing die vóór Java 1.5 werd gebruikt: de oude oplossing kon niet worden gebruikt met switch . Wat moet u nog meer weten over Enum ? Enum is een echte klasse met alle mogelijkheden die dit met zich meebrengt. Als de huidige implementatie van de dagen van de week bijvoorbeeld onvoldoende is, kunt u variabelen, constructors en methoden toevoegen aan 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 + '\'' +
               '}';
   }
}
Nu hebben onze Enum- constanten een titelveld , een getter en een overschreven toString -methode. Vergeleken met reguliere lessen werd Enum één ernstige beperking opgelegd : het kan niet worden geërfd. Bovendien hebben opsommingen karakteristieke methoden:
  • waarden() : retourneert een array van alle waarden in de Enum :

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

    Uitgang:

    [DayOfWeek{title = 'Zondag'}, DayOfWeek{title = 'Monday'}, DayOfWeek{title = 'Tuesday'}, DayOfWeek{title = 'Woensdag'}, DayOfWeek{title = 'Donderdag'}, DayOfWeek{title = 'Vrijdag'}, DagVanWeek{title = 'Zaterdag'}]

  • ordinal() : geeft het rangtelwoord van de constante terug. De nummering begint bij nul:

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

    Uitgang:

    0

  • valueOf() : retourneert het Enum- object dat overeenkomt met de doorgegeven naam:

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

    Uitgang:

    DayOfWeek{title = 'Zondag'}

Opmerking:we gebruiken hoofdletters om Enum -velden op te geven. Dit zijn constanten, dus gebruiken ze all-caps in plaats van camelCase .
Opmerkingen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION