JavaRush /Blog Java /Random-MS /Enum dalam Java: Cara menggunakan kelas

Enum dalam Java: Cara menggunakan kelas

Diterbitkan dalam kumpulan
hello! Dalam artikel ini saya akan memberitahu anda tentang Java Enums. Bayangkan anda telah diberi tugasan: buat kelas yang melaksanakan hari dalam seminggu . Pada pandangan pertama, tidak ada yang rumit tentang ini, dan 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 + '\'' +
               '}';
   }
}
Dan semuanya kelihatan baik-baik saja, tetapi terdapat satu masalah: anda boleh menghantar sebarang teks kepada pembina kelas DayOfWeek . Dengan cara ini, seseorang boleh mencipta hari dalam minggu "Frog", "Cloud" atau "azaza322". Ini jelas bukan tingkah laku yang kita harapkan, kerana hanya terdapat 7 hari sebenar dalam seminggu, dan setiap daripada mereka mempunyai nama. Oleh itu, tugas kami adalah untuk mengehadkan julat nilai yang mungkin untuk kelas " hari dalam seminggu ". Sebelum Java 1.5, pembangun terpaksa menghasilkan penyelesaian kepada masalah ini sendiri, kerana tiada penyelesaian siap sedia dalam bahasa itu sendiri. Pada masa itu, jika keadaan memerlukan bilangan nilai yang terhad, 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 + '\'' +
               '}';
   }
}
Perkara yang perlu anda perhatikan di sini:
  • Pembina persendirian. Jika pembina ditandakan dengan pengubah suai peribadi , objek kelas tidak boleh dibuat menggunakan pembina itu. Dan kerana terdapat hanya satu pembina dalam kelas ini, objek DayOfWeek tidak boleh dibuat sama sekali.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//error!
       		}
    }
  • Pada masa yang sama, kelas mengandungi bilangan objek statik awam yang diperlukan yang dimulakan mengikut cara yang kami perlukan (nama hari adalah betul).

    Ini memungkinkan untuk menggunakan objek dalam kelas lain.

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

    Kesimpulan:

    DayOfWeek{title='Ahad'}

Pendekatan ini sebahagian besarnya membolehkan kami menyelesaikan masalah. Kami mempunyai 7 hari dalam seminggu yang kami gunakan, dan tiada siapa yang boleh membuat yang baharu. Penyelesaian ini telah dicadangkan oleh Joshua Bloch dalam buku Effective Java . Buku ini, dengan cara ini, sangat keren dan mesti dibaca untuk mana-mana pembangun Java.
Cara menggunakan kelas Enum - 2
Dengan keluaran Java 1.5, bahasa itu memperkenalkan penyelesaian siap sedia untuk situasi sedemikian - penghitungan Enum . Enum juga satu kelas. Tetapi ia "disesuaikan" khas untuk menyelesaikan masalah yang serupa dengan kita: penciptaan julat nilai terhad tertentu. Oleh kerana pencipta Java sudah mempunyai contoh siap pakai (katakan, bahasa C, di mana Enum sudah wujud), mereka dapat mencipta pilihan yang optimum.

Apakah enum?

Jadi, apakah Enum dalam Java ? Mari kita lihat contoh DayOfWeek yang sama :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Ia sudah kelihatan lebih mudah :) Di dalam Enum kami terdapat 7 pemalar dengan akses statik. Kita sudah boleh menggunakannya untuk melaksanakan logik dalam program. Sebagai contoh, mari kita tulis program yang akan menentukan sama ada pelajar perlu pergi ke sekolah hari ini. Pelajar kami akan mempunyai rutin hariannya sendiri, yang ditetapkan oleh kelas ScholarSchedule :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Pembolehubah dayOfWeek dalam mod hari menentukan hari itu. Dan inilah kelas pelajar kami:
public class Scholar {

   private ScholarSchedule schedule;
   private boolean goToSchool;

   public void wakeUp() {

       if (this.schedule.getDayOfWeek() == DayOfWeek.SUNDAY) {
           System.out.println("Hooray, you can sleep some more!");
       } else {
           System.out.println("Damn, back to school :(");
       }
   }
}
Dalam kaedah wakeUp() , menggunakan Enum, kami menentukan tindakan selanjutnya pelajar. Kami tidak menerangkan secara terperinci maksud setiap pembolehubah dalam DayOfWeek , dan ini tidak perlu: mekanisme hari dalam seminggu sudah jelas, dan jika kami menggunakannya dalam bentuk semasa, mana-mana pembangun akan memahami apa sedang berlaku dalam kod anda. Satu lagi contoh kemudahan Enum ialah pemalarnya boleh digunakan dengan pernyataan suis . Sebagai contoh, kami sedang menulis program untuk diet yang ketat, di mana makanan dijadualkan mengikut hari:
public class VeryStrictDiet {
   public void takeLunch(DayOfWeek dayOfWeek) {
       switch (dayOfWeek) {
           case SUNDAY:
               System.out.println("Sunday lunch! Today you can even have a little sweet");
               break;
           case MONDAY:
               System.out.println("Monday Lunch: Chicken Noodles!");
               break;
           case TUESDAY:
               System.out.println("Tuesday, today is celery soup :(");
               break;
               //...and so on until the end
       }
   }
}
Ini adalah salah satu kelebihan Enum berbanding penyelesaian lama yang digunakan sebelum Java 1.5: penyelesaian lama tidak boleh digunakan dengan suis .

Apa lagi yang anda perlu tahu tentang kelas Enum?

Kelas Enum ialah kelas sebenar dengan semua keupayaan yang disertakan dengannya. Sebagai contoh, jika pelaksanaan semasa hari dalam seminggu tidak mencukupi untuk anda, 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 + '\'' +
               '}';
   }
}
Pemalar Enum kami kini mempunyai medan tajuk , pengambil dan kaedah toString yang diganti . Berbanding dengan kelas biasa, Enum mempunyai satu had yang serius - ia tidak boleh diwarisi. Di samping itu, penghitungan mempunyai kaedah unik untuk mereka:
  • values() : mengembalikan tatasusunan semua nilai yang disimpan dalam Enum :

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

    Kesimpulan:

    [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. Kira detik bermula dari sifar:

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

    Kesimpulan:

    0

  • valueOf() : Mengembalikan objek Enum yang sepadan dengan nama yang diberikan:

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

    Kesimpulan:

    DayOfWeek{title='Ahad'}

Beri perhatian:Kami menggunakan huruf besar nama unsur Enum kerana ia adalah pemalar dan ditetapkan sebagai pemalar, bukan camelCase .
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION