9.5 Object: The Cosmic Superclass

Di Java, setiap kelas yang telah di deklarasikan tanpa sebuah explicit extends clause akan secara otomatis extends the class object. Class object mendefinisikan beberapa general method, yaitu:
·         toString, yang menghasilkan string yang menjelaskan objek.
·          equal, yang membandingkan objek dengan satu sama lain.
·          hashCode, yang menghasilkan kode numerik untuk menyimpan objek dalam satu set.

9.5.1 Overriding the toString Method
toString method disebut otomatis kapanpun anda menggabungkan sebuah string dengan sebuah objek. Misalkan:
“box=” + box;
On one side of the + concatenation operator is a string, but on the other side is an object reference.
Bilangan juga di konversi ke strings ketika di gabungkan dengan string lain. Misalkan:
int umur = 18;
String s = "Umur Hari adalah " + age;
Let’s try the toString method for the BankAccount class:
BankAccount momsSavings = new BankAccount(5000);
String s = momsSavings.toString();
// Sets s to something like "BankAccount@d24606bf"
Hashcode dapat diguaan untuk mengatakan suatu objects apart- different objects seperti memiliki hashcode yang berbeda.
Kita harus mengoverride method dan tetap mendukung versi sebelumnya di BankAccount class.
public class BankAccount{
. . .
public String toString(){
return "BankAccount[balance=" + balance + "]";
}
}
This works better:
BankAccount momsSavings = new BankAccount(5000);
String s = momsSavings.toString(); // Sets s to "BankAccount[balance=5000]"
Override toSting method untuk menghasilkan string yang menjelaskan object’s state.

9.5.2 The equals Method
The object class juga mendukung equals method, yang menyatakan bahwa dua objek memiliki content yang sama:
if (stamp1.equals(stamp2)) . . .
// Contents are the same
Hal ini berbeda dengan operator ==, yang menyatakan bahwa dua objek adalah identik:
if (stamp1 == stamp2) . . .
// Objects are the same

9.5.3 The instanceof Operator
Diperbolehkan menyimpan subclass reference dalam variable superclass:
ChoiceQuestion cq = new ChoiceQuestion();
Question q = cq; // OK
Object obj = cq; // OK
Misalkan ada variable bertipe objek dan dia memegang Question refence. Dala hal ini kita dapat menggunakan cast untuk mengkonvertnya:
Question q = (Question) obj;
Namun ini agak berbahaya jika salah, dan obj sebenarnya mengacu ke sebuah objek dari jenis yang tidak berhubungan, maka "class cast" exception is thrown.
Untuk menghindarinya, dapat menggunakan instanceof operator yang digunakan untuk mengetes bahwa sebuah objek milik jenis tertentu. Misal:
Obj instanceof Question;
Akan mengembalikan nilai true jika tipe obj adalah konversi ke Question.

Dengan menggunakan instanceof operator, cast yang aman dapat dibuat:
if (obj instanceof Question){
Question q = (Question) obj;
}
Instanceof itu bukan sebuah method, dia adalah operator biasa seperti halnya + atau <. Tetapi instanceof tidak mengoperasikan pada bilangan.


Sumber: Horstmann, Coy. Fifth Edition. Big Java Early Objects.

8.2 Merancang Method yang Baik dalam Pemrograman

Beberapa kriteria yang berguna untuk menganalisis dan meningkatkan antarmuka publik dari kelas:

8.2.1 Providing a Cohesiv Public Interface
Sebuah kelas harus mewakili satu konsep. Semua fitur antarmuka harus terkait erat dengan konsep tunggal yang mewakili kelas.
Jika ada antarmuka publik dari kelas mengacu pada beberapa konsep, maka itu merupakan pertanda baik bahwa mungkin sudah saatnya untuk menggunakan kelas terpisah sebagai gantinya. Ini jelas merupakan solusi yang lebih baik, karena memisahkan tanggung jawab setiap masalah atau isu.

8.2.2 Meminimalkan Dependensi
Banyak method yang dibutuhkan kelas-kelas lain untuk melakukan pekerjaan mereka. Untuk memvisualisasikan hubungan antar kelas, seperti ketergantungan, programmer menggambar diagram kelas. Disimi, kita menggunakan UML ( "Unified Modeling Language") notasi untuk objek dan kelas. UML adalah notasi untuk analisis berorientasi objek dan desain diciptakan oleh Grady Booch, Ivar Jacobson, dan James Rumbaugh, tiga peneliti terkemuka dalam pengembangan softare berorientasi objek. (Lampiran H memiliki ringkasan
notasi UML yang digunakan disini.) Notasi UML membedakan antara objek diagram sebuah diagram kelas. Dalam sebuah diagram objek nama kelas digarisbawahi; dalam diagram kelas nama kelas tidak digarisbawahi. Dalam diagram kelas, ketergantungan ditunjukan oleh garis putus-putus dengan panah tip terbuka -berbentuk yang menunjuk ke kelas yang bergantung.

8.2.3 Memisahkan Accessors dan mutator
Sebuah muthator method mengubah keadaan suatu objek. Sebaliknya, accessor method
meminta objek untuk menghitung hasilnya, tanpa mengubah asalnya.
Sebuah kelas yang hanya memiliki metode accesor, tidak memiliki metode mutator disebut immutable.
String name = "John Q. Public";
String uppercased = name.toUpperCase (); // Nama tidak berubah
Referensi ke obyek dari kelas berubah dapat dengan aman dishare.

8.2.4 Meminimalkan Efek Samping
Efek samping dari method adalah setiap jenis modifikasi data yang diamati luar metode mutator method memiliki efek samping, yaitu modifikasi dari parameter implisit.

public void printBalance () // Tidak direkomendasikan {
System.out.println ( "Jumlah tersebut sekarang $" + saldo);
}

Metode ini bermutasi objek System.out, yang bukan merupakan bagian dari objek rekening bank. Itu adalah efek samping. Untuk menghindari efek samping ini, jaga sebagian besar kelas bebas dari operasi input dan output, dan berkonsentrasi input dan output di satu tempat, seperti main method dari sebuah program.

Sumber: Horstmann, Coy. Fifth Edition. Big Java Early Objects.