Pada post kali ini, kita ingin melihat lebih dalam pada pembuatan class, mengontrol akses kepada member dari sebuah class dan membuat constructors. Kita juga ingin mendiskusikan composition - sebuah kemampuan yang bisa membuat suatu kelas memiliki referensi kepada objek dari kelas-kelas lainnya sebagai member.
8.2 TIME CLASS CASE STUDY
Time1 Class Declaration
Contoh awal ini kita memiliki 2 kelas, Time1 dan Time1Test. Kelas Time1 merepresentasikan waktu hari ini. Kelas Time1Test adalah kelas aplikasi dimana main membuat satu objek kelas Time1 dan memanggil method-nya.
Fig. 8.1. Time1 class declaration maintains the time in a 24-hour format.
/**
* // Fig. 8.1: Time.java
* // Time1 class declaratoin maintains the time in 24-hour format.
*
* @author Ramadhan Arif Hardijansyah
* @version 0.1 10 October 2020
*/
public class Time1
{
private int hour; // 0 - 23
private int minute; // 0 - 59
private int second; // 0 - 59
/* set a new time value using universal time; ensure that the data remains consistent by setting invalid values to zero */
public void setTime(int h, int m, int s)
{
hour = ((h >= 0 && h < 24)? h : 0); // validate hour
minute = ((m >= 0 && m < 60)? m : 0); // validate minute
second = ((s >= 0 && s < 60)? s : 0); // validate second
} // end method setTime
// convert to String in universal-time format (HH:MM:SS)
public String toUniversalString() {
return String.format("%02d:%02d:%02d", hour, minute, second);
} // end method toUniversalString
// convert to String in standard-time format (H:MM:SS AM or PM)
public String toString() {
return String.format("%d:%02d:%02d %s", ((hour == 0 || hour == 12)? 12 : hour % 12), minute, second, ((hour < 12)? "AM" : "PM"));
} // end method toString
}
Fig. 8.2. Time1 object used in an application.
/**
* Write a description of class Time1Test here.
*
* @author Ramadhan Arif Hardijansyah
* @version 0.1 11 October 2020
*/
public class Time1Test
{
public static void main(String[] args)
{
// create and initialize a Time1 object
Time1 time = new Time1(); // invokes Time1 constructor
// output string representation of the time
System.out.print("The initial universaltime is: ");
System.out.println(time.toUniversalString());
System.out.print("The initial standard time is: ");
System.out.println(time.toString());
System.out.println();
// change time and output updated time
time.setTime(13, 27, 6);
System.out.print("Universal time after setTime is: ");
System.out.println(times.toUniversalString());
System.out.print("Standard time after setTime is: ");
System.out.println(time.toString());
System.out.println();
// set time with invalid values; output updated time
time.setTime(99, 99, 99);
System.out.println("After attempting invalid settings:");
System.out.print("Universal time: ");
System.out.println(time.toUniversalString());
System.out.print("Standard time: ");
System.out.println(time.toString());
} // end main
}
Berikut ini adalah diagram kelas Time Class Case Study dan hasil keluaran Terminal Window di BlueJ.
8.3 CONTROLLING ACCESS TO MEMBERS
Fig. 8.3 mendemonstrasikan bahwa anggota kelas private tidak bisa secara langsung diakses diluar kelas. Fungsi main pada kelas MemberAccessTest mencoba untuk mengakses secara langsung variable instance hour, minute, and second dari waktu objek Time1. Ketika program dikompilasi, kompiler menghasilkan pesan kesalahan yang menyatakan bahwa anggota private tidak dapat diakses.
Fig. 8.3. Private members of class Time1 are not accessible.
// Fig. 8.3: MemberAccessTest.java
// Private members of class Time1 are not accessible.
public class MemberAccessTest
{
public static void main(String[] args)
{
Time1 time = new Time1(); // create and initialize Time1 object
time.hour = 7; // error: hour has private access in Time1
time.minute = 15; // error: minute has private access in Time1
time.second = 30; // error: second has private access in Time1
time.getClass();
} // end main
} // end class MemberAccessTest
Dan berikut ini adalah diagram kelas dan screenshot editor kelas MemberAccessTest yang menunjukkan terdapat kesalahan kompilasi.
8.4 REFERRING TO THE CURRENT OBJECT’S MEMBERS WITH THE THIS REFERENCE
Setiap objek bisa mengakses referensi ke dirinya sendiri dengan kata kunci this. Ketika metode non-static dipanggil untuk sebuah objek tertentu, metode secara implisit menggunakan kata kunci this untuk merujuk ke variable instance objek metode lainnya.
Fig. 8.4. this used implicitly and explicitly to refer to members of an object.
// Fig. 8.4: ThisTest.java
// this used implicitly and explicitly to refer to members of an object.
public class ThisTest {
public static void main(String[] args) {
SimpleTime time = new SimpleTime(15, 30, 19);
System.out.println(time.buildString());
} // end main
} // end class ThisTest
/**
* SimpleTime
* , this class demonstrates the "this" reference
*/
class SimpleTime {
private int hour; // 0-23
private int minute; // 0-59
private int second; // 0-59
/**
* If the constructor uses parameter names identical to instance variable names the "this" reference is required to distinguish between naems
* @param hour
* @param minute
* @param second
*/
public SimpleTime(int hour, int minute, int second) {
this.hour = hour; // set "this" object's hour
this.minute = minute; // set "this" object's minute
this.second = second; // set "this" object's second
} // end SimpleTime constructor
/**
* use explicit and implicit "this" to call toUniversalString
* @return String
*/
public String buildString() {
return String.format("%24s: %s\n%24s: %s", "this.toUniversalString()", this.toUniversalString(), "toUniversalString()", toUniversalString());
} // end method buildString
/**
* convert to String in universal-time format (HH:MM:SS)
* @return String
*/
public String toUniversalString() {
/*
"this" is not required here to access instance variables, because method doesn't have local variables with the same names as instance variables
*/
return String.format("%02d:%02d:%02d", this.hour, this.minute, this.second);
} // end method toUniversalString
} // end class SimpleTime
Berikut ini adalah diagram kelas dan hasil keluaran Terminal Window pada BlueJ.
8.5 TIME CLASS CASE STUDY: OVERLOADED CONSTRUCTORS
Anda bisa mendeklarasikan constructor anda sendiri untuk menentukan bagaimana objek dari sebuah kelas diinisialisasi. Berikut merupakan demonstrasi sebuah kelas dengan beberapa overloaded constructor yang memungkinkan objek untuk diinisialisasi dengan cara yang berbeda. Untuk meng-overload sebuah constructor, cukup berikan beberapa deklarasi konstruktor yang berbeda dengan signature yang berbeda.
Fig. 8.5. Time2 class with overloaded constructors.
// Fig. 8.5: Time2.java
// Time2 class declaration with overloaded constructors.
public class Time2
{
private int hour; // 0 - 23
private int minute; // 0 - 59
private int second; // 0 - 59
// Time2 no-argument constructor: initializes each instance variable
// to zero; ensures that Time2 objects start in a consistent state
public Time2()
{
this(0, 0, 0); // invoke Time2 constructor with three arguments
}
// Time2 constructor: hour supplied, minute and second defaulted to 0
public Time2(int h)
{
this(h, 0, 0); // invoke Time2 constructor with three arguments
}
// Time2 constructor: hour and minute supplied, second defaulted to 0
public Time2(int h, int m)
{
this(h, m, 0); // invoke Time2 constructor with three arguments
}
// Time2 constructor: hour, minute, and second supplied
public Time2(int h, int m, int s)
{
setTime(h, m, s); // invoke setTime to validate time
}
// Time2 constructor: another Time2 object supplied
public Time2(Time2 time)
{
// invoke Time2 three-argument constructor
this(time.getHour(), time.getMinute(), time.getSecond());
}
// Set Methods
// set a new time value using universal time; ensure that
// the data remains consistent by setting invalid values to zero
public void setTime(int h, int m, int s)
{
setHour(h);
setMinute(m);
setSecond(s);
}
// validate and set hour
public void setHour(int h)
{
hour = ((h >= 0 && h < 24)? h : 0);
}
// validate and set minute
public void setMinute(int m)
{
minute = ((m >= 0 && m < 60)? m : 0);
}
// validate and set second
public void setSecond(int s)
{
second = ((s >= 0 && s < 60)? s : 0);
}
// Get Methods
// get hour value
public int getHour()
{
return hour;
}
// get minute value
public int getMinute()
{
return minute;
}
// get second value
public int getSecond()
{
return second;
}
// convert to Sttring in universal-time format (HH:MM:SS)
public String toUniversalString()
{
return String.format("%02d:%02d:%02d", getHour(), getMinute(), getSecond());
}
// convert to String in standard-time formatt (H:MM:SS AM or PM)
public String toString()
{
return String.format("%d:%02d:%02d %s", ((getHour() == 0 || getHour() == 12)? 12 : getHour() % 12), getMinute(), getSecond(), (getHour() < 12? "AM" : "PM"));
}
}
Fig. 8.6. Overloaded constructors used to initialize Time2 objects.
// Fig. 8.6: Time2Test.java
// Overloaded constructors used to initialize Timez objects.
public class Time2Test
{
public static void main(String args[])
{
Time2 t1 = new Time2(); // 00:00:00
Time2 t2 = new Time2(2); // 02:00:00
Time2 t3 = new Time2(21, 34); // 21:34:00
Time2 t4 = new Time2(12, 25, 42); // 12:25:42
Time2 t5 = new Time2(27, 74, 99); // 00:00:00
Time2 t6 = new Time2(t4); // 12:25:42
System.out.println("Constructed with:");
System.out.println("t1: all arguments defaulted");
System.out.printf(" %s\n", t1.toUniversalString());
System.out.printf(" %s\n", t1.toString());
System.out.println("t2: hour specified; minute and second defaulted");
System.out.printf(" %s\n", t2.toUniversalString());
System.out.printf(" %s\n", t2.toString());
System.out.println("t3: hour and minute specified; second defaulted");
System.out.printf(" %s\n", t3.toUniversalString());
System.out.printf(" %s\n", t3.toString());
System.out.println("t4: hour, minute and second specified");
System.out.printf(" %s\n", t4.toUniversalString());
System.out.printf(" %s\n", t4.toString());
System.out.println("t5: a11 invaIid values specified");
System.out.printf(" %s\n", t5.toUniversalString());
System.out.printf(" %s\n", t5.toString());
System.out.println("t6: Time2 object t4 specified");
System.out.printf(" %s\n", t6.toUniversalString());
System.out.printf(" %s\n", t6.toString());
} // end main
} // end class Time2Test
Berikut merupakan diagram kelas dan keluaran output dari BlueJ.
8.6 DEFAULT AND NO-ARGUMENT CONSTRUCTORS
Setiap kelas harus memiliki setidaknya satu konstruktor. Jika kelas anda mendeklarasikan konstruktor, kompiler tidak akan membuat konstruktor default. Pada kasus ini, untuk menentukan inisialisasi defaultt untuk objek kelas anda, anda harus mendeklarasikan sebuah konstruktor tanpa argumen seperti pada baris 12-15 dari Fig. 8.5. Seperti konstruktor default, konstruktor tanpa argumen dipanggil dengan tanda kurung kosong. Perhatikan bahwa konstruktor tanpa argumen Time2 secara eksplisit menginisialisasi objek Time2 dengan meneruskan ke konstruktor tiga-argumen dengan nilai 0 untuk setiap parameter. Karena nol adalah nilai default untuk variable instance int, konstruktor tanpa argumen dalam contoh ini sebenarnya dapat dideklarasikan dengan isi kosong. Dalam kasus ini, setiap variabel instance akan menerima nilai defaultnya ketika konstruktor tanpa arugmen dipanggil.
Sekian post tentang pembuatan class dan objek yang lebih dalam. Semoga bermanfaat.
Comments
Post a Comment