CodeGym /Java-blogg /Tilfeldig /Enum-klasse i Java
John Squirrels
Nivå
San Francisco

Enum-klasse i Java

Publisert i gruppen
Hei! I denne artikkelen skal vi fortelle deg om Java Enums . Tenk deg at du har fått følgende oppgave: lag en klasse som implementerer ukedagene . Ved første øyekast virker dette ganske enkelt. Koden din vil se omtrent slik ut:

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 ut til å være bra, men det er ett problem: du kan sende hvilken som helst tekst til konstruktøren av DayOfWeek- klassen. Det betyr at noen kan lage en ukedag kalt "Frog", "Cloud" eller "azaza322". Dette er tydeligvis ikke oppførselen vi forventer, siden det bare er 7 virkelige dager i uken, og hver av dem har et spesifikt navn. Derfor er oppgaven vår å begrense rekkevidden av mulige verdier for DayOfWeek -klassen. Før Java 1.5 kom, måtte utviklere selvstendig finne opp sine egne løsninger på dette problemet, siden språket ikke hadde en ferdig løsning. På den tiden, hvis programmerere trengte å begrense antall verdier, 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 hva du bør legge merke til:
  • Konstruktøren er privat. Hvis en konstruktør er merket med den private modifikatoren, kan den ikke brukes til å lage et objekt. Og siden klassen bare har én konstruktør, kan ingen DayOfWeek- objekter noen gang opprettes.

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

  • Selvfølgelig har klassen det nødvendige antallet offentlige statiske objekter, som ble korrekt initialisert (med de riktige navnene på ukedagene).

    Dette gjorde at disse objektene kunne brukes i andre klasser.

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

    Produksjon:

    DayOfWeek{title = 'søndag'}

Denne tilnærmingen løser i stor grad problemet. Vi har 7 dager i uken til rådighet, og ingen kan lage nye. Denne løsningen ble tilbudt av Joshua Bloch i sin bok Effektiv Java . Den boken er forresten veldig kul og en må-lese for enhver Java-utvikler. Slik bruker du Enum-klassen - 2Med utgivelsen av Java 1.5 fikk språket en ferdig løsning for slike situasjoner: Java Enums . Enum i Java er også en klasse. Den er spesielt "finjustert" til å løse problemer som dette, dvs. skape et visst begrenset verdispekter. Javas skapere hadde allerede klare eksempler (for eksempel hadde C allerede enum ), så de var i stand til å lage den beste varianten.

Så hva er Java Enum?

La oss se på DayOfWeek- eksemplet vårt på nytt:

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Nå ser det mye enklere ut :) Internt har Enum 7 statiske konstanter. Og det er noe vi kan bruke det til å implementere et program. La oss for eksempel skrive et program som avgjør om en elev trenger å gå på skolen i dag. Vår student vil ha en daglig timeplan, representert av StudentSchedule- klassen:

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Tidsplanobjektets dayOfWeek -variabel bestemmer hvilken dag som er i dag. Og her er studentklassen vår:

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 bruker vi Java Enum for å bestemme hva studenten skal gjøre videre. Vi ga ikke engang detaljer om hvert felt i DayOfWeek , og det trenger vi ikke: det er åpenbart hvordan ukedagene skal fungere. Hvis vi bruker den i sin nåværende form, vil enhver utvikler forstå hva som skjer i koden vår. Et annet eksempel på bekvemmeligheten til Enum er at konstantene kan brukes med switch-setningen. La oss for eksempel skrive et program for en streng diett, der retter er planlagt etter dag:

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 av Enums fordeler i forhold til den gamle løsningen som ble brukt før Java 1.5 — den gamle løsningen kunne ikke brukes med switch . Hva annet trenger du å vite om Enum ? Enum er en skikkelig klasse med alle de mulighetene dette innebærer. For eksempel, hvis gjeldende implementering av ukedagene er utilstrekkelig, kan du legge til 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 + '\'' +
               '}';
   }
}
Nå har våre Enum- konstanter et tittelfelt , getter og overstyrt toString -metode. Sammenlignet med vanlige klasser ble det satt en alvorlig begrensning på Enum - den kan ikke arves. I tillegg har oppregninger karakteristiske metoder:
  • values() : returnerer en matrise med alle verdiene i Enum :

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

    Produksjon:

    [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 til konstanten. Nummereringen starter fra null:

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

    Produksjon:

    0

  • valueOf() : returnerer Enum -objektet som tilsvarer det beståtte navnet:

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

    Produksjon:

    DayOfWeek{title = 'søndag'}

Merk:vi bruker store bokstaver for å spesifisere Enum- felt. Dette er konstanter, så de bruker all-caps i stedet for camelCase .
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION