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 :
- Konstanta enum merupakan implicity final, karena mereka menyatakan konstanta yang tidak boleh dirubah.
- Konstanta enum merupakan implicity statis.
- 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.
/**
* 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