JavaRush /Java Blog /Random-ID /Enum di Java: Cara menggunakan kelas

Enum di Java: Cara menggunakan kelas

Dipublikasikan di grup Random-ID
Halo! Pada artikel ini saya akan bercerita tentang Java Enums. Bayangkan Anda diberi tugas: membuat kelas yang mengimplementasikan hari-hari dalam seminggu . Sekilas, tidak ada yang rumit dalam hal ini, dan kode Anda akan terlihat 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 tampak baik-baik saja, tetapi ada satu masalah: Anda dapat meneruskan teks apa pun ke konstruktor kelas DayOfWeek . Dengan cara ini, seseorang dapat membuat hari dalam seminggu "Frog", "Cloud" atau "azaza322". Ini jelas bukan perilaku yang kita harapkan, karena hanya ada 7 hari nyata dalam seminggu, dan masing-masing hari mempunyai nama. Oleh karena itu, tugas kita adalah membatasi kisaran nilai yang mungkin untuk kelas “ hari dalam seminggu ”. Sebelum Java 1.5, pengembang terpaksa menemukan solusi sendiri untuk masalah ini, karena tidak ada solusi siap pakai dalam bahasa itu sendiri. Pada masa itu, jika situasinya memerlukan nilai dalam jumlah terbatas, 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 + '\'' +
               '}';
   }
}
Yang harus Anda perhatikan di sini:
  • Konstruktor swasta. Jika konstruktor ditandai dengan pengubah privat , objek kelas tidak dapat dibuat menggunakan konstruktor tersebut. Dan karena hanya ada satu konstruktor di kelas ini, objek DayOfWeek tidak dapat dibuat sama sekali.

    public class Main {
    
       		public static void main(String[] args) {
    
           			DayOfWeek sunday = new DayOfWeek();//error!
       		}
    }
  • Pada saat yang sama, kelas tersebut berisi jumlah objek statis publik yang diperlukan , yang diinisialisasi sesuai kebutuhan kita (nama hari sudah benar).

    Hal ini memungkinkan untuk menggunakan objek di kelas lain.

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

    Kesimpulan:

    DayOfWeek{title='Minggu'}

Pendekatan ini memungkinkan kami untuk memecahkan masalah dalam banyak hal. Kami memiliki 7 hari dalam seminggu, dan tidak ada yang bisa membuat hari baru. Solusi ini dikemukakan oleh Joshua Bloch dalam buku Effective Java . Omong-omong, buku ini sangat keren dan wajib dibaca oleh semua pengembang Java.
Cara menggunakan kelas Enum - 2
Dengan dirilisnya Java 1.5, bahasa tersebut memperkenalkan solusi siap pakai untuk situasi seperti itu - enumerasi Enum . Enum juga merupakan kelas. Namun hal ini secara khusus “disesuaikan” untuk memecahkan masalah yang serupa dengan masalah kita: penciptaan sejumlah nilai tertentu yang terbatas. Karena pembuat Java sudah memiliki contoh yang sudah jadi (misalnya, bahasa C, yang sudah memiliki Enum ), mereka dapat membuat opsi terbaik.

Apa itu enum?

Jadi, apa itu Enum di Jawa ? Mari kita lihat contoh DayOfWeek yang sama :
public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Ini sudah terlihat lebih sederhana :) Di dalam Enum kami ada 7 konstanta dengan akses statis. Kita sudah bisa menggunakannya untuk mengimplementasikan logika dalam program. Sebagai contoh, mari kita tulis sebuah program yang akan menentukan apakah seorang siswa perlu bersekolah hari ini. Siswa kami akan memiliki rutinitas hariannya sendiri, yang ditentukan oleh kelas ScholarSchedule :
public class ScholarSchedule {

   private DayOfWeek dayOfWeek;
   //...other fields


   public DayOfWeek getDayOfWeek() {
       return dayOfWeek;
   }

   public void setDayOfWeek(DayOfWeek dayOfWeek) {
       this.dayOfWeek = dayOfWeek;
   }
}
Variabel dayOfWeek dalam mode hari menentukan hari apa sekarang. Dan inilah kelas siswa 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 metode wakeUp() , menggunakan Enum, kami menentukan tindakan siswa selanjutnya. Kami bahkan tidak menjelaskan secara rinci apa arti setiap variabel di DayOfWeek , dan ini tidak perlu: ​​mekanisme hari dalam seminggu sudah jelas, dan jika kami menggunakannya dalam bentuknya saat ini, pengembang mana pun akan memahami apa sedang terjadi dalam kode Anda. Contoh lain dari kemudahan Enum adalah konstanta yang dapat digunakan dengan pernyataan switch . Misalnya, kami sedang menulis program diet ketat, di mana makanan dijadwalkan berdasarkan 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 dibandingkan solusi lama yang digunakan sebelum Java 1.5: solusi lama tidak dapat digunakan dengan switch .

Apa lagi yang perlu Anda ketahui tentang kelas Enum?

Kelas Enum adalah kelas nyata dengan segala kemampuan yang menyertainya. Misalnya, jika penerapan hari dalam seminggu saat ini tidak cukup bagi Anda, Anda dapat menambahkan variabel, konstruktor, dan metode ke 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 + '\'' +
               '}';
   }
}
Konstanta Enum kami sekarang memiliki title field , pengambil, dan metode toString yang diganti . Dibandingkan dengan kelas reguler, Enum memiliki satu batasan serius - tidak dapat diwarisi. Selain itu, enumerasi memiliki metode yang unik:
  • value() : mengembalikan array dari semua nilai yang disimpan di Enum :

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

    Kesimpulan:

    [DayOfWeek{title='Minggu'}, DayOfWeek{title='Senin'}, DayOfWeek{title='Tuesday'}, DayOfWeek{title='Rabu'}, DayOfWeek{title='Thursday'}, DayOfWeek{title= 'Jumat'}, Hari Minggu{title='Sabtu'}]

  • ordinal() : mengembalikan nomor urut suatu konstanta. Hitung mundur dimulai dari nol:

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

    Kesimpulan:

    0

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

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

    Kesimpulan:

    DayOfWeek{title='Minggu'}

Perhatian:Kami menggunakan huruf besar pada nama elemen Enum karena merupakan konstanta dan ditetapkan seperti itu, bukan camelCase .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION