CodeGym /Blog Java /rawak /Kelas Enum di Jawa
John Squirrels
Tahap
San Francisco

Kelas Enum di Jawa

Diterbitkan dalam kumpulan
Hai! Dalam artikel ini kami akan memberitahu anda tentang Java Enums . Bayangkan anda telah diberi tugasan berikut: buat kelas yang melaksanakan hari dalam seminggu . Pada pandangan pertama, ini kelihatan agak mudah. Kod anda akan kelihatan seperti ini:

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 + '\'' +
               '}';
   }
}
Semuanya nampak baik-baik saja, tetapi terdapat satu masalah: anda boleh menghantar sebarang teks kepada pembina kelas DayOfWeek . Ini bermakna seseorang boleh membuat hari dalam seminggu yang dinamakan "Frog", "Cloud" atau "azaza322". Ini jelas bukan tingkah laku yang kami jangkakan, kerana hanya terdapat 7 hari sebenar dalam seminggu, dan setiap daripadanya mempunyai nama tertentu. Oleh itu, tugas kami adalah untuk mengehadkan julat nilai yang mungkin untuk kelas DayOfWeek . Sebelum Java 1.5 datang, pembangun perlu mencipta penyelesaian mereka sendiri untuk masalah ini secara bebas, kerana bahasa itu tidak mempunyai penyelesaian siap sedia. Pada masa itu, jika pengaturcara perlu mengehadkan bilangan nilai, mereka melakukan ini:

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 + '\'' +
               '}';
   }
}
Inilah yang anda patut perhatikan:
  • Pembina adalah peribadi. Jika pembina ditandakan dengan pengubah suai peribadi , ia tidak boleh digunakan untuk mencipta objek. Dan kerana kelas hanya mempunyai satu pembina, tiada objek DayOfWeek boleh dibuat.

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

  • Sudah tentu, kelas itu mempunyai bilangan objek statik awam yang diperlukan , yang dimulakan dengan betul (menggunakan nama yang betul untuk hari dalam seminggu).

    Ini membenarkan objek ini digunakan dalam kelas lain.

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

    Pengeluaran:

    DayOfWeek{title = 'Ahad'}

Pendekatan ini sebahagian besarnya menyelesaikan masalah. Kami mempunyai 7 hari dalam seminggu, dan tiada siapa yang boleh membuat yang baharu. Penyelesaian ini ditawarkan oleh Joshua Bloch dalam bukunya Effective Java . By the way, buku itu sangat keren dan mesti dibaca oleh mana-mana pembangun Java. Cara menggunakan kelas Enum - 2Dengan keluaran Java 1.5, bahasa itu memperoleh penyelesaian sedia untuk situasi sedemikian: Java Enums . Enum di Jawa juga merupakan kelas. Ia khusus "ditala" untuk menyelesaikan masalah seperti ini, iaitu mencipta julat nilai terhad tertentu. Pencipta Java sudah mempunyai contoh sedia (contohnya, C sudah mempunyai enum ), jadi mereka dapat mencipta varian terbaik.

Jadi apa itu Java Enum?

Mari lihat semula contoh DayOfWeek kami:

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Sekarang ia kelihatan lebih mudah :) Secara dalaman, Enum kami mempunyai 7 pemalar statik. Dan itu adalah sesuatu yang boleh kita gunakan untuk melaksanakan program. Sebagai contoh, mari kita tulis program yang menentukan sama ada pelajar perlu pergi ke sekolah hari ini. Pelajar kami akan mempunyai jadual harian, diwakili oleh kelas StudentSchedule :

public class StudentSchedule {

   private DayOfWeek dayOfWeek;
   // ... other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Pembolehubah dayOfWeek objek jadual menentukan hari hari ini. Dan inilah kelas pelajar kami:

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 :(");
       }
   }
}
Dalam kaedah wakeUp() , kami menggunakan Java Enum untuk menentukan perkara yang perlu dilakukan oleh pelajar seterusnya. Kami tidak memberikan butiran tentang setiap medan dalam DayOfWeek , dan kami tidak perlu: jelas sekali cara hari dalam seminggu berfungsi. Jika kami menggunakannya dalam bentuk semasa, mana-mana pembangun akan memahami apa yang berlaku dalam kod kami. Satu lagi contoh kemudahan Enum ialah pemalarnya boleh digunakan dengan pernyataan suis. Sebagai contoh, mari kita tulis program untuk diet yang ketat, di mana hidangan dijadualkan mengikut hari:

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
       }
   }
}
Ini adalah salah satu kelebihan Enums berbanding penyelesaian lama yang digunakan sebelum Java 1.5 — penyelesaian lama tidak boleh digunakan dengan suis . Apa lagi yang anda perlu tahu tentang Enum ? Enum ialah kelas sebenar dengan semua kemungkinan yang diperlukan. Sebagai contoh, jika pelaksanaan semasa hari dalam seminggu tidak mencukupi, anda boleh menambah pembolehubah, pembina dan kaedah pada 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 + '\'' +
               '}';
   }
}
Sekarang pemalar Enum kami mempunyai medan tajuk , pengambil dan kaedah toString yang diganti. Berbanding dengan kelas biasa, satu had serius diletakkan pada Enum — ia tidak boleh diwarisi. Selain itu, penghitungan mempunyai kaedah ciri:
  • values() : mengembalikan tatasusunan semua nilai dalam Enum :

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

    Pengeluaran:

    [DayOfWeek{title = 'Ahad'}, DayOfWeek{title = 'Isnin'}, DayOfWeek{title = 'Selasa'}, DayOfWeek{title = 'Rabu'}, DayOfWeek{title = 'Khamis'}, DayOfWeek{title = 'Jumaat'}, DayOfWeek{title = 'Sabtu'}]

  • ordinal() : mengembalikan nombor ordinal pemalar. Penomboran bermula dari sifar:

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

    Pengeluaran:

    0

  • valueOf() : mengembalikan objek Enum yang sepadan dengan nama yang diluluskan:

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

    Pengeluaran:

    DayOfWeek{title = 'Ahad'}

Catatan:kami menggunakan huruf besar untuk menentukan medan Enum . Ini adalah pemalar supaya mereka menggunakan huruf besar dan bukannya camelCase .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION