Hi! Dina iki kita bakal ngomong babagan salah sawijining jinis data khusus Jawa:
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:
Panyerat 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
(singkatan saka "enumerasi"). Apa ndadekake khusus? Coba bayangake apa sing kudu ditindakake "sasi" ing sawijining program. 
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 Month
kelas, 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. kitaMonth
kelas 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 Month
kelas 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 Month
obyek. 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 Enum
katon ing Jawa. Sejatine, Enum
iku kelas Jawa sing nyedhiyani pesawat winates saka nilai obyek. Mangkene carane katon:
public enum Month {
JANUARY,
FEBRUARY,
MARCH
}
Ing definisi, kita nuduhake yen Enum
kelas Jawa, nanging apa bener? Ya, lan kita malah bisa verifikasi. Contone, coba nggawe Month
enum 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 final
lapangan? Ya, minangka conto, konstruksi lawas ora ngidini kita nggunakake nilai kita dhewe ing switch
statement. 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 enum
muncul 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 Enum
obyek tetep statis, kaya sadurunge Java 1.5. Kita ora perlu nggawe Month
obyek kanggo ngakses sasi. Nalika nggarap enums, iku penting banget kanggo ora lali sing Enum
kelas 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 Month
enum 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 enum
2 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, Enum
pancen 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
. Sugeng maca! :)
GO TO FULL VERSION