JavaRush /Blog Jawa /Random-JV /Enum ing Jawa. Tuladha praktis. Nambahake Konstruktor lan...

Enum ing Jawa. Tuladha praktis. Nambahake Konstruktor lan Metode

Diterbitake ing grup
Hello! Dina iki kita bakal ngomong babagan jinis data khusus ing Jawa - Enum(singkatan kanggo enumerasi). Apa fitur sing? Ayo mbayangno yen kita kudu ngetrapake wulan ing program kasebut. Enum.  Tuladha praktis.  Nambahake konstruktor lan metode - 1Iku bakal katon, apa masalah? Sampeyan mung kudu nemtokake sifat apa wae sing diduweni sasi. Mbok menawa kita kudu, pisanan kabeh, jeneng sasi lan jumlah dina ing. Solusi kanggo masalah 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 +
               '}';
   }
}
Full set mangga! We duwe kelas Month, kothak perlu, getters-setters toString(),. Kajaba equals()sampeyan hashCode()kudu nambah kanggo rasa seneng lengkap :) Nanging, kita duwe masalah konsep. Minangka sampeyan bisa elinga, salah siji saka kaluwihan utama OOP iku nggampangake kanggo model entitas donya nyata. Kursi, mobil, planet - kabeh konsep saka urip saben dina gampang diwakili ing program nggunakake abstraksi. Masalahe yaiku sawetara entitas ing jagad nyata duwe sawetara makna sing winates. Ing setaun mung ana 4 mangsa. Mung ana 7 cathetan ing musik. Ana mung 12 sasi ing tanggalan. Samudra mung duwe 11 kanca (sanajan iki bisa didebat :)) Ing tembung liya, kelas Jawa biasa ora bisa menehi model entitas kasebut lan ngurmati kendala alam. Kelas kita Monthduwe kabeh lapangan sing dibutuhake. Nanging yen programer liyane nggunakake, ora ana sing bakal nyegah dheweke nggawe obyek sing edan:
public class Main {

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

}
Yen iki katon ing program, iku ora bakal gampang kanggo nemokake durjana! Ing tangan siji, programmer sing nggawe obyek bisa ngerti yen kelas kasebut Monthtegese "wulan taun" lan ora nulis omong kosong kasebut. Ing sisih liya, dheweke mung nggunakake kesempatan sing diwenehake dening desainer kelas. Apa aku bisa nemtokake jeneng lan nomer dina? Dheweke ditunjuk. Apa sing kudu ditindakake ing kahanan kaya ngono? Sadurunge release saka basa Jawa versi 1.5, programer kudu, terus terang, metu saka iku :) Ing dina iku, padha nggawe konstruksi ing ngisor 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("Январь", 31);
   public static Month FEBRUARY = new Month("Февраль", 28);
   public static Month MARCH = new Month("Март", 31);

   @Override
   public String toString() {
       return "Month{" +
               "name='" + name + '\'' +
               ", daysCount=" + daysCount +
               '}';
   }
}
Ing kene kita wis nyederhanakake nomer sasi dadi telung tinimbang rolas supaya contone luwih cendhek. Desain kaya mengkono bisa ngatasi masalah kasebut. Opsi kanggo obyek sing digawe diwatesi dening konstruktor pribadi:
private Month(String name, int daysCount) {
       this.name = name;
       this.daysCount = daysCount;
   }
Programer sing nggunakake kelas ora mung bisa nggawe Month. Dheweke dipeksa nggunakake obyek statis pungkasan sing diwenehake dening pangembang kelas. Iku katon kaya iki:
public class Main {

   public static void main(String[] args) {

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

}
Nanging, pangembang Jawa wis weruh masalah sing ana. Mesthi, iku gedhe sing programer bisa teka munggah karo solusi nggunakake alat kasedhiya ing basa, nanging ora katon supaya prasaja! Solusi sing jelas dibutuhake, bisa diakses malah kanggo pamula. Katon ing Jawa Enum. Ateges, Enumiku kelas Jawa sing nyedhiyakake obyek nilai sing winates. Mangkene apa sing katon:
public enum Month {

   JANUARY,
   FEBRUARY,
   MARCH
}
Ing definisi, kita nuduhake yen Enumiki kelas Jawa, nanging iki pancene? Ya, lan kita malah bisa mriksa. Coba, contone, warisan kita enum Monthsaka sawetara kelas liyane:
public abstract class AbstractMonth {
}

//ошибка! No extends clause allowed to enum
public enum Month extends AbstractMonth {

   JANUARY,
   FEBRUARY,
   MARCH
}
Yagene iki kedadeyan? Nalika kita nulis menyang program:
public enum Month
Compiler ngowahi printah iki dadi kode kaya iki:
public Class Month extends Enum
Kaya sing wis dingerteni, warisan pirang-pirang ora diidini ing Jawa. Mulane, AbstractMonthkita ora bisa warisan saka. Kepiye carane desain anyar iki bisa Enumdigunakake? Lan kepiye bedane karo desain lawas kanthi static finallapangan? Contone, umpamane, desain lawas ora ngidini kita nggunakake set nilai kita dhewe ing switchekspresi. Bayangake yen kita pengin nggawe program sing bakal ngelingake kita apa preian sing dirayakake ing wulan iki:
public class HolidayReminder {

   public void printHolidays(Month month) {

       switch (month) {

           //error!
           case JANUARY:
       }
   }
}
Ing kene, kaya sing sampeyan ngerteni, kompiler nggawe kesalahan. Nanging sawise Java 1.5 muncul enum, 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("7 января будет Рождество!");
               break;
           case FEBRUARY:
               System.out.println("В феврале празднуется День Защитника Отечества - 23 февраля!");
               break;
           case MARCH:
               System.out.println("В марте отмечается Всемирный Женский День - 8 марта!");
               break;
       }
   }
}



public class Main {

   public static void main(String[] args) {

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

   }

}
Output konsol:

7 января будет Рождество!
Wigati dimangerteni: akses menyang obyek Enumtetep statis, kaya sadurunge Java 1.5. Kita ora perlu nggawe obyek Monthkanggo ngakses sasi. Nalika nggarap enumerasi, penting banget ora lali yen Enumiki minangka kelas lengkap. Iki tegese, yen perlu, sampeyan bisa nemtokake konstruktor lan cara ing. Contone, ing potongan kode sadurunge kita mung nemtokake nilai JANUARI, FEBRUARI, MARET. Nanging, kita bisa nggedhekake kita enum Monthkaya iki:
public enum Month {

   JANUARY("Январь", 31),
   FEBRUARY("Февраль", 28),
   MARCH("Март", 31),
   APRIL("Апрель", 30),
   MAY("Май", 31),
   JUNE("Июнь", 30),
   JULY("Июль", 31),
   AUGUST("Август", 31),
   SEPTEMBER("Сентябрь", 30),
   OCTOBER("Октябрь", 31),
   NOVEMBER("Ноябрь", 30),
   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 wis nambahake 2 kolom kanggo kita enum- jeneng sasi lan jumlah dina, konstruktor nggunakake kolom kasebut, getters-setters, metode toString(), uga 2 metode statis. Kaya sing sampeyan ngerteni, ora ana masalah karo iki: kaya sing wis dingerteni sadurunge, enumiki minangka 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='Июнь', daysCount=30}, Month{name='Июль', daysCount=31}, Month{name='Август', daysCount=31}]
Pungkasan, aku pengin menehi rekomendasi buku babagan Jawa sing migunani banget, yaiku "Jawa Efektif" dening Joshua Bloch . Enum.  Tuladha praktis.  Nambahake konstruktor lan metode - 3Panyerat minangka salah satunggaling pangripta basa Jawi, pramila panjenengan sedaya saged pitados dhateng pitedahipun babagan ngginakaken piranti basa ingkang leres saha cekap :) Gegayutan kaliyan piwucalan kula, kula nyuwun pitedah dhumateng bab buku ingkang dipunkhususaken kangge enum. Wacan sing produktif! :)
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION