CodeGym /Java Blogu /Rastgele /Java'da Enum sınıfı
John Squirrels
Seviye
San Francisco

Java'da Enum sınıfı

grupta yayınlandı
MERHABA! Bu yazımızda sizlere Java Enums'tan bahsedeceğiz . Size şu görevin verildiğini düşünün: haftanın günlerini uygulayan bir sınıf oluşturun . İlk bakışta, bu oldukça basit görünüyor. Kodunuz şuna benzer:

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 + '\'' +
               '}';
   }
}
Her şey yolunda görünüyor, ancak bir sorun var: DayOfWeek sınıfının yapıcısına herhangi bir metin iletebilirsiniz . Bu, birisinin haftanın "Kurbağa", "Bulut" veya "azaza322" adlı bir gününü oluşturabileceği anlamına gelir. Haftanın yalnızca 7 gerçek günü olduğundan ve her birinin belirli bir adı olduğundan, bu açıkça beklediğimiz davranış değildir. Bu nedenle, görevimiz DayOfWeek sınıfı için olası değer aralığını bir şekilde sınırlamaktır. Java 1.5 ortaya çıkmadan önce, dilin hazır bir çözümü olmadığından, geliştiricilerin bu soruna bağımsız olarak kendi çözümlerini icat etmeleri gerekiyordu. O günlerde, programcıların değer sayısını sınırlamaları gerekiyorsa, bunu yapıyorlardı:

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 + '\'' +
               '}';
   }
}
İşte dikkat etmeniz gerekenler:
  • Yapıcı özeldir. Bir yapıcı özel değiştirici ile işaretlenmişse , bir nesne yaratmak için kullanılamaz. Ve sınıfın yalnızca bir yapıcısı olduğundan, hiçbir DayOfWeek nesnesi oluşturulamaz.

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

  • Tabii ki, sınıf , doğru şekilde başlatılan (haftanın günlerinin doğru adlarını kullanarak) gerekli sayıda genel statik nesneye sahiptir .

    Bu, bu nesnelerin diğer sınıflarda kullanılmasına izin verdi.

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

    Çıktı:

    DayOfWeek{title = 'Pazar'}

Bu yaklaşım sorunu büyük ölçüde çözmektedir. Haftanın 7 günü emrimizde ve kimse yenilerini yaratamaz. Bu çözüm, Joshua Bloch tarafından Etkili Java adlı kitabında önerildi . Bu arada, bu kitap çok güzel ve her Java geliştiricisi için mutlaka okunması gereken bir kitap. Enum sınıfı nasıl kullanılır - 2Java 1.5'in piyasaya sürülmesiyle dil, bu tür durumlar için hazır bir çözüm kazandı: Java Enums . Java'daki Enum da bir sınıftır. Bunun gibi sorunları çözmek, yani belirli bir sınırlı değer aralığı oluşturmak için özel olarak "ince ayarlanmıştır". Java'nın yaratıcıları zaten hazır örneklere sahipti (örneğin, C zaten enum'a sahipti ), böylece en iyi varyantı yaratabildiler.

Peki Java Enum nedir?

DayOfWeek örneğimizi tekrar gözden geçirelim :

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Şimdi bu çok daha basit görünüyor :) Dahili olarak, Enum'umuz 7 statik sabite sahiptir. Ve bu, bir programı uygulamak için kullanabileceğimiz bir şey. Örneğin bugün bir öğrencinin okula gitmesi gerekip gerekmediğini belirleyen bir program yazalım. Öğrencimizin, StudentSchedule sınıfı tarafından temsil edilen günlük bir programı olacaktır:

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Zamanlama nesnesinin dayOfWeek değişkeni bugünün hangi gün olduğunu belirler. Ve işte öğrenci sınıfımız:

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 :(");
       }
   }
}
WakeUp() yönteminde , öğrencinin bundan sonra ne yapması gerektiğini belirlemek için Java Enum'u kullanırız . DayOfWeek'teki her alan hakkında ayrıntı bile vermedik ve vermemize de gerek yok: haftanın günlerinin nasıl çalışması gerektiği açık. Mevcut haliyle kullanırsak, herhangi bir geliştirici kodumuzda neler olduğunu anlayacaktır. Enum'un rahatlığına bir başka örnek de, sabitlerinin switch deyimi ile kullanılabilmesidir. Örneğin, yemeklerin güne göre programlandığı katı bir diyet için bir program yazalım:

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
       }
   }
}
Bu, Enums'un Java 1.5'ten önce kullanılan eski çözüme göre avantajlarından biridir — eski çözüm, switch ile kullanılamaz . Enum hakkında bilmeniz gereken başka neler var ? Enum, bunun gerektirdiği tüm olasılıklara sahip gerçek bir sınıftır. Örneğin, haftanın günlerinin mevcut uygulaması yetersizse DayOfWeek'e değişkenler, yapıcılar ve yöntemler ekleyebilirsiniz :

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 + '\'' +
               '}';
   }
}
Artık Enum sabitlerimizin bir başlık alanı, alıcısı ve geçersiz kılınan toString yöntemi var. Normal sınıflarla karşılaştırıldığında, Enum'a ciddi bir sınırlama getirildi - miras alınamaz. Ek olarak, numaralandırmaların karakteristik yöntemleri vardır:
  • values() : Enum içindeki tüm değerlerin bir dizisini döndürür :

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

    Çıktı:

    [DayOfWeek{title = 'Pazar'}, DayOfWeek{title = 'Pazartesi'}, DayOfWeek{title = 'Salı'}, DayOfWeek{title = 'Çarşamba'}, DayOfWeek{title = 'Perşembe'}, DayOfWeek{title = 'Cuma'}, DayOfWeek{title = 'Cumartesi'}]

  • ordinal() : sabitin sıra sayısını döndürür. Numaralandırma sıfırdan başlar:

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

    Çıktı:

    0

  • valueOf() : iletilen ada karşılık gelen Enum nesnesini döndürür:

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

    Çıktı:

    DayOfWeek{title = 'Pazar'}

Not:Enum alanlarını belirtmek için büyük harfler kullanırız . Bunlar sabitlerdir, dolayısıyla camelCase yerine tümü büyük harf kullanırlar .
Yorumlar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION