CodeGym /Java blogg /Slumpmässig /Enum klass i Java
John Squirrels
Nivå
San Francisco

Enum klass i Java

Publicerad i gruppen
Hej! I den här artikeln kommer vi att berätta om Java Enums . Föreställ dig att du har fått följande uppgift: skapa en klass som implementerar veckodagarna . Vid första anblicken verkar detta ganska okomplicerat. Din kod skulle se ut ungefär så här:

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 + '\'' +
               '}';
   }
}
Allt verkar vara bra, men det finns ett problem: du kan skicka vilken text som helst till konstruktören av DayOfWeek -klassen. Det betyder att någon kan skapa en veckodag som heter "Frog", "Cloud" eller "azaza322". Detta är uppenbarligen inte det beteende vi förväntar oss, eftersom det bara finns 7 riktiga dagar i veckan, och var och en av dem har ett specifikt namn. Därför är vår uppgift att på något sätt begränsa utbudet av möjliga värden för DayOfWeek -klassen. Innan Java 1.5 kom, var utvecklare tvungna att självständigt uppfinna sina egna lösningar på detta problem, eftersom språket inte hade en färdig lösning. På den tiden, om programmerare behövde begränsa antalet värden, gjorde de så här:

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 + '\'' +
               '}';
   }
}
Här är vad du bör lägga märke till:
  • Konstruktören är privat. Om en konstruktor är markerad med den privata modifieraren kan den inte användas för att skapa ett objekt. Och eftersom klassen bara har en konstruktor, kan inga DayOfWeek- objekt någonsin skapas.

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

  • Naturligtvis har klassen det erforderliga antalet offentliga statiska objekt, som initierades korrekt (med de korrekta namnen på veckodagarna).

    Detta gjorde att dessa objekt kunde användas i andra klasser.

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

    Produktion:

    DayOfWeek{title = 'Söndag'}

Detta tillvägagångssätt löser till stor del problemet. Vi har 7 dagar i veckan till vårt förfogande, och ingen kan skapa nya. Denna lösning erbjöds av Joshua Bloch i sin bok Effektiv Java . Den boken är förresten väldigt cool och ett måste att läsa för alla Java-utvecklare. Hur man använder Enum-klassen - 2Med lanseringen av Java 1.5 fick språket en färdig lösning för sådana situationer: Java Enums . Enum i Java är också en klass. Den är speciellt "finjusterad" för att lösa sådana här problem, dvs skapa ett visst begränsat värdespektrum. Javas skapare hade redan färdiga exempel (till exempel hade C redan enum ), så de kunde skapa den bästa varianten.

Så vad är Java Enum?

Låt oss återgå till vårt DayOfWeek- exempel:

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Nu ser det mycket enklare ut :) Internt har vår Enum 7 statiska konstanter. Och det är något vi kan använda det för att implementera ett program. Låt oss till exempel skriva ett program som avgör om en elev behöver gå till skolan idag. Vår student kommer att ha ett dagligt schema, representerat av StudentSchedule- klassen:

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Schemaobjektets dayOfWeek- variabel bestämmer vilken dag som är idag. Och här är vår studentklass:

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 metoden wakeUp() använder vi Java Enum för att bestämma vad studenten ska göra härnäst. Vi lämnade inte ens detaljer om varje fält i DayOfWeek , och det behöver vi inte: det är uppenbart hur veckodagarna ska fungera. Om vi ​​använder det i sin nuvarande form, skulle vilken utvecklare som helst förstå vad som händer i vår kod. Ett annat exempel på bekvämligheten med Enum är att dess konstanter kan användas med switch-satsen. Låt oss till exempel skriva ett program för en strikt diet, där rätter är schemalagda per 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
       }
   }
}
Detta är en av Enums fördelar jämfört med den gamla lösningen som användes före Java 1.5 — den gamla lösningen kunde inte användas med switch . Vad mer behöver du veta om Enum ? Enum är en riktig klass med alla möjligheter som detta innebär. Till exempel, om den nuvarande implementeringen av veckodagarna är otillräcklig, kan du lägga till variabler, konstruktorer och metoder till 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 våra Enum- konstanter ett titelfält , getter och åsidosatt toString -metod. Jämfört med vanliga klasser sattes en allvarlig begränsning på Enum - den kan inte ärvas. Dessutom har uppräkningar karakteristiska metoder:
  • values() : returnerar en matris med alla värden i Enum :

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

    Produktion:

    [DayOfWeek{title = 'Söndag'}, DayOfWeek{title = 'Monday'}, DayOfWeek{title = 'Tisdag'}, DayOfWeek{title = 'Onsdag'}, DayOfWeek{title = 'Torsdag'}, DayOfWeek{title = 'Fredag'}, DayOfWeek{title = 'Lördag'}]

  • ordinal() : returnerar ordningsnumret för konstanten. Numreringen börjar från noll:

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

    Produktion:

    0

  • valueOf() : returnerar Enum -objektet som motsvarar det angivna namnet:

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

    Produktion:

    DayOfWeek{title = 'Söndag'}

Notera:vi använder stora bokstäver för att ange Enum -fält. Dessa är konstanter så de använder all-caps snarare än camelCase .
Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION