CodeGym /Java Blog /Acak /Kelas Enum di Jawa
John Squirrels
Level 41
San Francisco

Kelas Enum di Jawa

Dipublikasikan di grup Acak
Hai! Pada artikel ini kami akan memberi tahu Anda tentang Java Enums . Bayangkan Anda diberi tugas berikut: membuat kelas yang mengimplementasikan hari dalam seminggu . Sepintas, ini tampak agak mudah. 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 + '\'' +
               '}';
   }
}
Segalanya tampak baik-baik saja, tetapi ada satu masalah: Anda dapat meneruskan teks apa pun ke konstruktor kelas DayOfWeek . Itu berarti seseorang dapat membuat hari dalam seminggu bernama "Frog", "Cloud" atau "azaza322". Ini jelas bukan perilaku yang kami harapkan, karena hanya ada 7 hari nyata dalam seminggu, dan masing-masing memiliki nama tertentu. Oleh karena itu, tugas kita adalah membatasi rentang nilai yang mungkin untuk kelas DayOfWeek . Sebelum Java 1.5 hadir, para pengembang harus secara mandiri menemukan solusi mereka sendiri untuk masalah ini, karena bahasa tersebut tidak memiliki solusi siap pakai. Pada masa itu, jika pemrogram perlu membatasi jumlah 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 harus Anda perhatikan:
  • Konstruktor bersifat pribadi. Jika konstruktor ditandai dengan pengubah pribadi , konstruktor tidak dapat digunakan untuk membuat objek. Dan karena kelas hanya memiliki satu konstruktor, tidak ada objek DayOfWeek yang dapat dibuat.

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

  • Tentu saja, kelas memiliki jumlah objek statis publik yang diperlukan , yang diinisialisasi dengan benar (menggunakan nama hari yang benar dalam seminggu).

    Ini memungkinkan objek-objek ini digunakan di kelas lain.

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

    Keluaran:

    HariDalamMinggu{judul = 'Minggu'}

Pendekatan ini sebagian besar memecahkan masalah. Kami memiliki 7 hari dalam seminggu, dan tidak ada yang dapat membuat yang baru. Solusi ini ditawarkan oleh Joshua Bloch dalam bukunya Effective Java . Omong-omong, buku itu sangat keren dan harus dibaca oleh pengembang Java mana pun. Cara menggunakan kelas Enum - 2Dengan dirilisnya Java 1.5, bahasa tersebut memperoleh solusi siap pakai untuk situasi seperti itu: Java Enums . Enum di Jawa juga merupakan kelas. Ini secara khusus "disetel" untuk memecahkan masalah seperti ini, yaitu menciptakan rentang nilai tertentu yang terbatas. Pembuat Java sudah memiliki contoh siap (misalnya, C sudah memiliki enum ), sehingga mereka dapat membuat varian terbaik.

Jadi apa itu Java Enum?

Mari kita lihat kembali contoh DayOfWeek kita:

public enum DayOfWeek {

   SUNDAY,
   MONDAY,
   TUESDAY,
   WEDNESDAY,
   THURSDAY,
   FRIDAY,
   SATURDAY
}
Sekarang terlihat jauh lebih sederhana :) Secara internal, Enum kami memiliki 7 konstanta statis. Dan itu adalah sesuatu yang bisa kita gunakan untuk mengimplementasikan sebuah program. Misalnya, mari kita tulis sebuah program yang menentukan apakah seorang siswa perlu pergi ke sekolah hari ini. Siswa kami akan memiliki jadwal 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;
   }
}
Variabel dayOfWeek objek jadwal menentukan hari apa hari ini. Dan inilah kelas siswa 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 metode wakeUp() , kami menggunakan Java Enum untuk menentukan apa yang harus dilakukan siswa selanjutnya. Kami bahkan tidak memberikan detail tentang setiap bidang di DayOfWeek , dan kami tidak perlu melakukannya: sudah jelas bagaimana hari dalam seminggu seharusnya bekerja. Jika kami menggunakannya dalam bentuk saat ini, pengembang mana pun akan memahami apa yang terjadi dalam kode kami. Contoh lain dari kemudahan Enum adalah bahwa konstantanya dapat digunakan dengan pernyataan switch. Misalnya, mari kita tulis program diet ketat, di mana hidangan dijadwalkan berdasarkan 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 keunggulan Enum dibandingkan solusi lama yang digunakan sebelum Java 1.5 — solusi lama tidak dapat digunakan dengan switch . Apa lagi yang perlu Anda ketahui tentang Enum ? Enum adalah kelas nyata dengan semua kemungkinan yang diperlukan. Misalnya, jika penerapan hari dalam seminggu saat ini tidak memadai, 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 + '\'' +
               '}';
   }
}
Sekarang konstanta Enum kita memiliki kolom judul , pengambil, dan metode toString yang diganti. Dibandingkan dengan kelas reguler, satu batasan serius ditempatkan pada Enum - tidak dapat diwariskan. Selain itu, pencacahan memiliki metode karakteristik:
  • values() : mengembalikan array dari semua nilai di Enum :

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

    Keluaran:

    [HariMinggu{judul = 'Minggu'}, HariMinggu{judul = 'Senin'}, HariMinggu{judul = 'Selasa'}, HariMinggu{judul = 'Rabu'}, HariMinggu{judul = 'Kamis'}, HariMinggu{judul = 'Jumat'}, Hari Minggu{title = 'Sabtu'}]

  • ordinal() : mengembalikan nomor urut konstanta. Penomoran dimulai dari nol:

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

    Keluaran:

    0

  • valueOf() : mengembalikan objek Enum yang sesuai dengan nama yang diteruskan:

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

    Keluaran:

    HariDalamMinggu{judul = 'Minggu'}

Catatan:kami menggunakan huruf besar untuk menentukan bidang Enum . Ini adalah konstanta sehingga mereka menggunakan huruf besar semua daripada CamelCase .
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION