CodeGym /Java blog /Tilfældig /Enum klasse i Java
John Squirrels
Niveau
San Francisco

Enum klasse i Java

Udgivet i gruppen
Hej! I denne artikel vil vi fortælle dig om Java Enums . Forestil dig, at du har fået følgende opgave: Opret en klasse, der implementerer ugedagene . Ved første øjekast virker dette ret ligetil. Din kode ville se sådan ud:

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 + '\'' +
               '}';
   }
}
Alt ser ud til at være i orden, men der er et problem: du kan sende enhver tekst til konstruktøren af ​​DayOfWeek- klassen. Det betyder, at nogen kunne oprette en ugedag med navnet "Frø", "Sky" eller "azaza322". Dette er tydeligvis ikke den adfærd, vi forventer, da der kun er 7 rigtige dage i ugen, og hver af dem har et specifikt navn. Derfor er vores opgave på en eller anden måde at begrænse rækken af ​​mulige værdier for DayOfWeek- klassen. Før Java 1.5 kom, måtte udviklere selvstændigt opfinde deres egne løsninger på dette problem, da sproget ikke havde en færdig løsning. I de dage, hvis programmører havde brug for at begrænse antallet af værdier, gjorde de dette:

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 + '\'' +
               '}';
   }
}
Her er, hvad du bør bemærke:
  • Konstruktøren er privat. Hvis en konstruktør er markeret med den private modifikator, kan den ikke bruges til at oprette et objekt. Og da klassen kun har én konstruktør, kan der aldrig oprettes nogen DayOfWeek- objekter.

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

  • Selvfølgelig har klassen det nødvendige antal offentlige statiske objekter, som blev initialiseret korrekt (ved at bruge de korrekte navne på ugedagene).

    Dette gjorde det muligt for disse objekter at blive brugt i andre klasser.

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

    Produktion:

    DayOfWeek{title = 'søndag'}

Denne tilgang løser stort set problemet. Vi har 7 dage om ugen til rådighed, og ingen kan oprette nye. Denne løsning blev tilbudt af Joshua Bloch i sin bog Effektiv Java . Den bog er i øvrigt meget fed og et must-read for enhver Java-udvikler. Sådan bruger du Enum-klassen - 2Med udgivelsen af ​​Java 1.5 fik sproget en færdig løsning til sådanne situationer: Java Enums . Enum i Java er også en klasse. Den er specielt "finjusteret" til at løse problemer som denne, altså skabe en vis begrænset række af værdier. Javas skabere havde allerede klar eksempler (for eksempel havde C allerede enum ), så de var i stand til at skabe den bedste variant.

Så hvad er Java Enum?

Lad os gense vores DayOfWeek- eksempel:

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Nu ser det meget enklere ud :) Internt har vores Enum 7 statiske konstanter. Og det er noget, vi kan bruge det til at implementere et program. Lad os for eksempel skrive et program, der afgør, om en elev skal i skole i dag. Vores elev vil have et dagligt skema, repræsenteret af StudentSchedule- klassen:

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Skemaobjektets dayOfWeek -variabel bestemmer, hvilken dag der er i dag. Og her er vores elevklasse:

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 :(");
       }
   }
}
I wakeUp()- metoden bruger vi Java Enum til at bestemme, hvad eleven skal gøre næste gang. Vi gav ikke engang detaljer om hvert felt i DayOfWeek , og det behøver vi ikke: det er indlysende, hvordan ugedagene skal fungere. Hvis vi bruger det i sin nuværende form, vil enhver udvikler forstå, hvad der sker i vores kode. Et andet eksempel på bekvemmeligheden ved Enum er, at dens konstanter kan bruges med switch-sætningen. Lad os for eksempel skrive et program for en streng diæt, hvor retter er planlagt om dagen:

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
       }
   }
}
Dette er en af ​​Enums fordele i forhold til den gamle løsning, der blev brugt før Java 1.5 — den gamle løsning kunne ikke bruges med switch . Hvad skal du ellers vide om Enum ? Enum er en rigtig klasse med alle de muligheder det medfører. For eksempel, hvis den aktuelle implementering af ugedagene er utilstrækkelig, kan du tilføje variabler, konstruktører og metoder til 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 har vores Enum- konstanter et titelfelt , getter og tilsidesat toString- metode. Sammenlignet med almindelige klasser blev der sat en alvorlig begrænsning på Enum - den kan ikke nedarves. Derudover har opregninger karakteristiske metoder:
  • values() : returnerer en matrix af alle værdierne i Enum :

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

    Produktion:

    [DayOfWeek{title = 'Søndag'}, DayOfWeek{title = 'Mandag'}, DayOfWeek{title = 'Tuesday'}, DayOfWeek{title = 'Onsdag'}, DayOfWeek{title = 'Torsdag'}, DayOfWeek{title = 'Fredag'}, DayOfWeek{title = 'Lørdag'}]

  • ordinal() : returnerer ordenstallet for konstanten. Nummereringen starter fra nul:

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

    Produktion:

    0

  • valueOf() : returnerer Enum -objektet, der svarer til det beståede navn:

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

    Produktion:

    DayOfWeek{title = 'søndag'}

Bemærk:vi bruger store bogstaver til at angive Enum -felter. Disse er konstanter, så de bruger all-caps i stedet for camelCase .
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION