CodeGym /Blog Jawa /Acak /Enum. Tuladha praktis. Nambahake konstruktor lan cara
John Squirrels
tingkat
San Francisco

Enum. Tuladha praktis. Nambahake konstruktor lan cara

Diterbitake ing grup
Hi! Dina iki kita bakal ngomong babagan salah sawijining jinis data khusus Jawa: Enum(singkatan saka "enumerasi"). Apa ndadekake khusus? Coba bayangake apa sing kudu ditindakake "sasi" ing sawijining program. Enum.  Tuladha praktis.  Nambahake konstruktor lan metode - 1 Ora katon masalah, ta? Kita mung kudu nemtokake sifat apa wae sing ana ing sasi. Mbokmenawa kita kudu jeneng sasi lan jumlah dina. Solusi katon cukup prasaja:

public class Month {

   private String name;
   private int daysCount;

   public Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getDaysCount() {
       return daysCount;
   }

   public void setDaysCount(int daysCount) {
       this.daysCount = daysCount;
   }

   @Override
   public String toString() {
       return "Month{" +
               "name='" + name + '\'' +
               ", daysCount=" + daysCount +
               '}';
   }
}
Shabang kabeh! Kita duwe Monthkelas, lapangan sing dibutuhake, getter / setter, lan toString(). Kajaba, mesthi, kita kudu nambah equals()lanhashCode()kanggo entuk rasa seneng sing lengkap :) Nanging ing kene kita duwe masalah konseptual. Minangka sampeyan bisa uga elinga, salah sawijining kaluwihan utama OOP yaiku nggampangake model entitas saka jagad nyata. Kursi, mobil, planet - kabeh konsep iki saka urip biasa gampang dituduhake ing program kanthi bantuan abstraksi. Masalahe yaiku sawetara entitas nyata duwe sawetara nilai sing winates. Mung ana 4 mangsa ing setahun. Ana mung 8 cathetan ing oktaf. Tanggalan mung 12 sasi. Lan Danny Ocean of Ocean's 11 mung duwe 11 kanca (sanajan ora masalah :)) Sing penting yaiku kelas Jawa biasa ora bisa menehi model entitas kasebut lan ngetrapake watesan alamiah. kitaMonthkelas duwe kabeh kolom sing dibutuhake. Nanging yen programer liyane nggunakake, ora ana sing bisa nyegah dheweke nggawe obyek sing ora edan:

public class Main {

   Month month1 = new Month("lolkek", 322);
   Month month2 = new Month("yahoooooooooooo", 12345);

}
Yen iki katon ing kode kita, iku ora bakal gampang kanggo nemokake culprit! Ing tangan siji, programmer nggawe obyek bisa nyadari yen Monthkelas tegese "sasi ing setahun" lan ora nulis omong kosong kuwi. Ing tangan liyane, programmer mung njupuk kauntungan saka kabisan sing desainer kelas kasedhiya. Apa bisa menehi jeneng lan nomer dina sing sewenang-wenang? Sing persis apa kita entuk. Apa banjur kudu kita tindakake ing kahanan iki? Jujur, sadurunge Java 1.5 dirilis, programer kudu kreatif :) Ing jaman semana, dheweke nggawe struktur kaya iki:

public class Month {

   private String name;
   private int daysCount;

   private Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }

   public static Month JANUARY = new Month("January", 31);
   public static Month FEBRUARY = new Month("February", 28);
   public static Month MARCH = new Month("March", 31);

   @Override
   public String toString() {
       return "Month{" +
               "name='" + name + '\'' +
               ", daysCount=" + daysCount +
               '}';
   }
}
Ing kene kita wis ngethok jumlah sasi saka rolas dadi telung supaya contone luwih cendhek. Desain kaya mengkono bisa ngatasi masalah kasebut. Kemampuan kanggo nggawe obyek diwatesi kanggo konstruktor pribadi:

private Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }
Programer sing nggunakake kelas ora mung bisa nggawe Monthobyek. Dheweke kudu nggunakake obyek statis pungkasan sing diwenehake dening pangembang kelas. Contone, kaya iki:

public class Main {

   public static void main(String[] args) {

       Month january = Month.JANUARY;
       System.out.println(january);
   }

}
Nanging, pangembang Jawa narik kawigaten marang masalah sing ana. Mesthi, iku gedhe sing programer padha bisa teka munggah karo solusi nggunakake alat kasedhiya ing basa, nanging ora katon gampang banget! Solusi sing jelas dibutuhake, sanajan kanggo wong anyar. Lan banjur Enumkaton ing Jawa. Sejatine, Enumiku kelas Jawa sing nyedhiyani pesawat winates saka nilai obyek. Mangkene carane katon:

public enum Month {
  
   JANUARY,
   FEBRUARY,
   MARCH
}
Ing definisi, kita nuduhake yen Enumkelas Jawa, nanging apa bener? Ya, lan kita malah bisa verifikasi. Contone, coba nggawe Monthenum kita warisan sawetara kelas liyane:

public abstract class AbstractMonth {
}

// Error! The extends clause cannot be used with an enum
public enum Month extends AbstractMonth {

   JANUARY,
   FEBRUARY,
   MARCH
}
Yagene kedadeyan kasebut? Nalika kita nulis:

public enum Month
compiler ngowahi statement iki menyang kode ing ngisor iki:

public Class Month extends Enum
Kaya sing wis dingerteni, Jawa ora ndhukung warisan pirang-pirang. Mulane, kita ora bisa warisan AbstractMonth. Carane bisa mbangun anyar iki, Enum, digunakake? Lan kepiye bedane karo konstruksi lawas karo static finallapangan? Ya, minangka conto, konstruksi lawas ora ngidini kita nggunakake nilai kita dhewe ing switchstatement. Bayangake yen kita pengin nggawe program sing bakal ngelingake kita babagan preian sing dirayakake saben wulan:

public class HolidayReminder {

   public void printHolidays(Month month) {

       switch (month) {

           // Error!
           case JANUARY:
       }
   }
}
Nalika sampeyan bisa ndeleng, compiler mbuwang kesalahan ing kene. Nanging sawise enummuncul ing Java 1.5, kabeh dadi luwih gampang:

public enum Month {

   JANUARY,
   FEBRUARY,
   MARCH
}

public class HolidayReminder {

   public void printHolidays(Month month) {

       switch (month) {
          
           case JANUARY:
               System.out.println("New Year's Day is January 1st!");
               break;
           case FEBRUARY:
               System.out.println("Valentine's Day is February 14th!");
               break;
           case MARCH:
               System.out.println("Saint Patrick's Day is March 17th!");
               break;
       }
   }
}


public class Main {

   public static void main(String[] args) {

       HolidayReminder reminder = new HolidayReminder();
       reminder.printHolidays(Month.JANUARY);

   }

}
Output konsol:

New Year's Day is January 1st!
Elinga yen akses menyang Enumobyek tetep statis, kaya sadurunge Java 1.5. Kita ora perlu nggawe Monthobyek kanggo ngakses sasi. Nalika nggarap enums, iku penting banget kanggo ora lali sing Enumkelas lengkap. Iki tegese, yen perlu, sampeyan bisa nemtokake konstruktor lan cara ing. Contone, ing fragmen kode sadurunge, kita mung nemtokake nilai: JANUARI, FEBRUARI, MARET. Nanging, kita bisa nggedhekake Monthenum kaya iki:

public enum Month {

   JANUARY("January", 31),
   FEBRUARY("February", 28),
   MARCH("March", 31),
   APRIL("April", 30),
   MAY("May", 31),
   JUNE("June", 30),
   JULY("July", 31),
   AUGUST("August", 31),
   SEPTEMBER("September", 30),
   OCTOBER("October", 31),
   NOVEMBER("November", 30),
   DECEMBER("December", 31);

   private String name;
   private int daysCount;

   Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }

   public static Month[] getWinterMonths() {

       return new Month[]{DECEMBER, JANUARY, FEBRUARY};
   }

   public static Month[] getSummerMonths() {

       return new Month[]{JUNE, JULY, AUGUST};
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       this.name = name;
   }

   public int getDaysCount() {
       return daysCount;
   }

   public void setDaysCount(int daysCount) {
       this.daysCount = daysCount;
   }

   @Override
   public String toString() {
       return "Month{" +
               "name='" + name + '\'' +
               ", daysCount=" + daysCount +
               '}';
   }
}
Ing kene kita menehi enum2 kolom (jeneng sasi lan jumlah dina), konstruktor sing nggunakake kolom kasebut, getter / setter, metode toString(), lan 2 metode statis. Nalika sampeyan bisa ndeleng, ora ana masalah karo iki. Maneh, Enumpancen kelas lengkap:

import java.util.Arrays;

public class Main {

   public static void main(String[] args) {

       System.out.println(Arrays.toString(Month.getSummerMonths()));

   }

}
Output konsol:

[Month{name='June', daysCount=30}, Month{name='July', daysCount=31}, Month{name='August', daysCount=31}]
Pungkasan, aku pengin menehi rekomendasi buku Jawa sing migunani banget, yaiku "Jawa Efektif" dening Joshua Bloch . Enum.  Tuladha praktis.  Nambahake konstruktor lan metode - 3Panyerat minangka salah sawijining pangripta Jawa, mula sampeyan mesthi bisa dipercaya pituture babagan carane nggunakake piranti basa kanthi bener lan kompeten :) Ing babagan piwulangan, aku menehi saran supaya sampeyan menehi perhatian khusus marang bab buku kasebut Enum. Sugeng maca! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION