Minggu, 05 Maret 2017

Composition, Enumerations, and Static Class Members

A. COMPOSITION

Sebuah kelas dapat memiliki referensi ke objek dari kelas-kelas lain sebagai anggota(members). Hal ini disebut Composition(Komposisi).

Komposisi kadang-kadang disebut juga sebagai memiliki relationship. Jadi komposisi adalah dimana hubungan suatu objek tergantung dengan objek lainnya. Misalnya sebuah objek jam alarm. Jam alarm perlu mengetahui waktu saat ini dan saat waktu kapan alarm harus berbunyi. Sehingga wajar untuk memasukkan 2 referensi untuk objek waktu jam alarm dalam suatu objek.

Contoh lainnya yaitu objek data karyawan. Komposisi pada objek data karyawan ini terdapat objek class Date, objek  class Employee, dan objek class EmployeeTest. Dimana objek class Date mempresentasikan tanggal. Objek class Employee mempresentasikan nama awal dan akhir karyawan beserta tanggal lahir dan tanggal dipekerjakannya seorang karyawan tersebut dengan memanggil method pada class date. Sedangkan objek class EmployeeTest merupakan kelas aplikasi untuk mengimplementasikan kedua kelas tersebut.

Berikut ini program class Date, class Employee dan class EmployeeTest.

Source code : Class Date
 /**  
  * Program Kelas Date  
  * Deklarasi kelas date  
  * Nama file : Date.java  
  */  
   
 public class Date  
 {  
   private int month;  
   private int day;  
   private int year;  
     
   private static final int[] daysPerMonth = //days in each month  
     {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  
       
   //contruktor : call checkMonth to confirm proper value for month;  
   //call checkDay to confirm proper value for day  
   public Date (int theMonth, int theDay, int theYear)  
   {  
     month = checkMonth(theMonth);  
     year = theYear;  
     day = checkDay(theDay);  
       
     System.out.printf ("Date object constructor for date %s\n", this);  
   }  
     
   //utility method to confirm proper month value  
   private int checkMonth(int testMonth)  
   {  
     if (testMonth > 0 && testMonth <= 12)  
       return testMonth;  
     else   
       throw new IllegalArgumentException("Month must be 1 - 12");  
   }  
     
   //utility method to confirm proper day value based on month and year  
   private int checkDay(int testDay)  
   {  
     //check if day in range for month  
     if(testDay > 0 && testDay <= daysPerMonth[month])  
       return testDay;  
         
     //check for leap year  
     if(month == 2 && testDay == 29 && ( year % 400 == 0 || (year % 4 == 0 && 100 != 0)))  
       return testDay;  
       
     throw new IllegalArgumentException("day out-of-range for the specified month and year");  
   }  
     
   //return a String of the form month/day/year  
   public String toString()  
   {  
     return String.format("%d/%d/%d", month, day, year);  
   }  
 }  

Source code : Class Employee
 /**  
  * Program kelas Employee  
  * Kelas employee dengan referensi ke objek lain  
  * Nama file : Employee.java  
  */  
   
 public class Employee  
 {  
   private String firstName;  
   private String lastName;  
   private Date birthDate;  
   private Date hireDate;  
     
   //contsructor to initialize name, birth date and hire date  
   public Employee(String first, String last, Date dateOfBirth, Date dateOfHire)  
   {  
     firstName = first;  
     lastName = last;  
     birthDate = dateOfBirth;  
     hireDate = dateOfHire;  
   }  
     
   //convert Employee to String format  
   public String toString()  
   {  
     return String.format ("%s, %s Hired: %s Birthday: %s", lastName, firstName, hireDate, birthDate);  
   }  
 }  
   

Source code : Class EmployeeTest
 /**  
  * Program kelas EmployeeTest  
  * Demonstrasi komposisi  
  * Nama file : EmployeeTest.java  
  */  
   
 public class EmployeeTest  
 {  
   public static void main (String[] agrs)  
   {  
     Date birth = new Date (7, 24, 1949);  
     Date hire = new Date (3, 12, 1988);  
     Employee employee = new Employee ("Bob", "Blue", birth, hire);  
       
     System.out.println(employee);  
   }  
 }  

Output :



B. ENUMERATIONS

Enumeration adalah kumpulan nama-nama konstanta yang didefinisikan sebagai tipe data baru.

Pada bagian ini, kita akan membahas hubungan jenis enum dan kelas. Seperti kelas, semua jenis enum adalah jenis referensi. Jenis enum dinyatakan dengan deklarasi enum, yang merupakan deklarasi daftar konstanta enum yang dipisahkan koma, mungkin opsional termasuk komponen lain dari kelas tradisional, seperti constructor, field, dan method.

Setiap deklarasi enum menyatakan kelas enum dengan batasan sebagai berikut :
  1. Konstanta enum merupakan implicity final, karena mereka menyatakan konstanta yang tidak boleh dirubah.
  2. Konstanta enum merupakan implicity statis.
  3. Setiap usaha untuk menciptakan sebuah objek dari tipe enum dengan operator new akan menghasilkan compilation error.
Konstanta enum dapat digunakan dimana saja konstanta digunakan, seperti label kasus pernyataan switch dan untuk mengontrol tingkatan untuk laporan.

Berikut ini program Book yang menunjukkan bagaimana untuk mendeklarasikan variabel instance, konstruktor, dan method dalam jenis enum beserta program EnumTest untuk menguji tipe enum Book dan menggambarkan bagaimana iterasi melalui berbagai konstanta enum.

Source code : program tipe enum Book
 /**  
  * Program Enum Book  
  * Mendeklarasikan tipe enum dengan kontruktor dan contoh eksplisit bidang dan accesor untuk bidang ini  
  * Nama file : Book.java  
  */  
   
 public enum Book  
 {  
   //declare constants of enum type  
   JHTP("Java How to Program","2012"),  
   CHTP("C How to Program", "2007"),  
   IW3HTP("Internet & World Wide Web How to Program", "2008"),  
   CPPHTP("C++ How to Program", "2012"),  
   VBHTP("Visual Basic 2010 How to Program", "2011"),  
   CSHARPHTP("Visual C# 2010 How to Program", "2011");  
     
   //instance fields  
   private final String title; //book title  
   private final String copyrightYear; //copyright year  
     
   //enum constructor  
   Book (String bookTitle, String year)  
   {  
     title = bookTitle;  
     copyrightYear = year;  
   }  
     
   //accessor for field title  
   public String getTitle()  
   {  
     return title;  
   }//end method getTitle  
     
   //accessor for field copyrightYear  
   public String getCopyrightYear()  
   {  
     return copyrightYear;  
   }  
 }  

Source code : Program EnumTest
 /**  
  * Program kelas EnumTest  
  * Menguji Book tipe enum  
  * Nama file : Enumtest.java  
  */  
   
 import java.util.EnumSet;  
   
 public class EnumTest  
 {  
   public static void main (String[] args)  
   {  
     System.out.println ("All books:\n");  
       
     //print all books in enum Book  
     for (Book book : Book.values())  
       System.out.printf ("%-10s%-45s%s\n", book, book.getTitle(), book.getCopyrightYear());  
         
     System.out.println ("\nDisplay a range of enum constants: \n");  
       
     //print first four books  
     for (Book book : EnumSet.range (Book.JHTP, Book.CPPHTP))  
       System.out.printf ("%-10s%-45s%s\n", book, book.getTitle(), book.getCopyrightYear());  
   }  
 }  

Output :


C. Static Class Members

Setiap objek memiliki salinan dari semua variabel instance dari kelas. Dalam kasus tertentu, hanya satu salinan dari variabel tertentu harus dimiliki oleh semua objek dari kelas. Field Static (biasa disebut dengan class variable) yang digunakan dalam kasus tersebut. Variabal Statis merupakan classwide information dimana semua objek kelas membagi data yang sama. Deklarasi variabel statis dimulai dengan kata kunci static.

Variabel statis memiliki ruang kelas. Kita dapat mengakses anggota statis kelas public melalui referensi ke semua objek kelas, atau dengan kualifikasi nama anggota dengan nama kelas dan titik(.).

Metode static  tidak dapat mengakses anggota kelas non-static, karena metode static dapat dipanggil bahkan ketika tidak ada objek dari kelas telah dipakai(instantiated). Untuk alasan yang sama, referensi this tidak dapat digunakan dalam metode static. Referensi this harus mengacu ke objek tertentu dari kelas, dan ketika metode static dipanggil, mungkin tidak ada benda kelasnya dalam memori.

Contoh pada kasus ini yaitu pelacakan jumlah objek karyawan yang telah dibuat. Pada program ini terdapat 2 kelas yaitu kelas Employee dan kelas EmployeeTest. Dimana kelas Employee mendeklarasikan variabel private static hitung dan public static metode getCount Sedangkan kelas EmployeeTest merupakan kelas aplikasi yang mendemonstrasikan anggota static.

Berikut ini program kelas Employee dan kelas EmployeeTest :

Source code : Program Employee
 /**  
  * Program Employee  
  * Variabel static digunakan untuk mempertahankan jumlah hitungan objek Karyawan di memori  
  * Nama file : Employee.java  
  */  
   
 public class Employee  
 {  
   private String firstName;  
   private String lastName;  
   private static int count = 0; //number of Employees created  
     
   //initialize Employee, add 1 to static count and output String indicating that constructor was called  
   public Employee (String first, String last)  
   {  
     firstName = first;  
     lastName = last;  
       
     ++count; //increment static count of Employees  
     System.out.printf("Employee constructor: %s %s; count = %d\n", firstName, lastName, count);  
   }  
     
   //get first name  
   public String getFirstName()  
   {  
     return firstName;  
   }  
     
   //get last name  
   public String getLastName()  
   {  
     return lastName;  
   }  
     
   //static method to get static count value  
   public static int getCount()  
   {  
     return count;  
   }  
 }  

Source code : Program EmployeeTest
 /**  
  * Program EmployeeTest  
  * Demonstrasi anggota static  
  * Nama file : EmployeeTest.java  
  */  
   
 public class EmployeeTest  
 {  
   public static void main (String[] args)  
   {  
     //show that count is 0 before creating Employees  
     System.out.printf ("Employee before instantiation: %d\n", Employee.getCount());  
       
     //create two Employees; count should be 2  
     Employee e1 = new Employee("Susan","Baker");  
     Employee e2 = new Employee("Bob","Blue");  
       
     //show that count is 2 after creating two Employees  
     System.out.println("\nEmployee after instantiation: ");  
     System.out.printf("via e1.getCount(): %d\n", e1.getCount());  
     System.out.printf("via e2.getCount(): %d\n", e2.getCount());  
     System.out.printf("via Employee.getCount(): %d\n", Employee.getCount());  
       
     //get names of Employees  
     System.out.printf("\nEmployee 1: %s %s\nEmployee 2: %s %s\n",   
       e1.getFirstName(), e1.getLastName(),  
       e2.getFirstName(), e2.getLastName());  
       
     //inthis example, there is only one reference to each Employee.  
     //so the following two statements indicate that these objects are eligible for garbage collection  
     e1 = null;  
     e2 = null;  
   }  
 }  

Output :

Tidak ada komentar:

Posting Komentar