Bangunan memiliki tempat mereka, bahkan di Jawa. Anda hanya boleh menggunakannya jika dua hal berikut ini benar:
- Anda hanya perlu mengumpulkan data yang tidak memiliki perilaku apa pun, misalnya untuk meneruskan sebagai parameter
- Tidak masalah sedikit pun seperti apa nilai yang dimiliki data agregat
Jika ini masalahnya, maka Anda harus membuat bidang publik dan melewati getter / setter. Lagipula Getters dan setter kikuk, dan Java konyol karena tidak memiliki properti seperti bahasa yang berguna. Karena objek struct-like Anda seharusnya tidak memiliki metode apa pun, bidang publik paling masuk akal.
Namun, jika salah satu dari itu tidak berlaku, Anda sedang berhadapan dengan kelas nyata. Itu berarti semua bidang harus bersifat pribadi. (Jika Anda benar-benar membutuhkan bidang pada cakupan yang lebih mudah diakses, gunakan pengambil / penyetel.)
Untuk memeriksa apakah seharusnya struktur Anda memiliki perilaku, lihat ketika bidang digunakan. Jika tampaknya melanggar katakan, jangan tanya , maka Anda harus memindahkan perilaku itu ke dalam kelas Anda.
Jika beberapa data Anda tidak boleh berubah, maka Anda harus membuat semua bidang itu final. Anda mungkin mempertimbangkan untuk membuat kelas Anda tidak berubah . Jika Anda perlu memvalidasi data Anda, maka berikan validasi di setter dan konstruktor. (Trik yang berguna adalah mendefinisikan setter pribadi dan memodifikasi bidang Anda di dalam kelas Anda hanya menggunakan setter itu.)
Contoh Botol Anda kemungkinan besar akan gagal dalam kedua pengujian. Anda dapat memiliki (buat) kode yang terlihat seperti ini:
public double calculateVolumeAsCylinder(Bottle bottle) {
return bottle.height * (bottle.diameter / 2.0) * Math.PI);
}
Sebaliknya seharusnya
double volume = bottle.calculateVolumeAsCylinder();
Jika Anda mengubah tinggi dan diameter, apakah itu botol yang sama? Mungkin tidak. Itu harus final. Apakah nilai negatif ok untuk diameter? Haruskah Botol Anda lebih tinggi dari lebar? Bisakah Cap menjadi nol? Tidak? Bagaimana Anda memvalidasi ini? Anggaplah klien itu bodoh atau jahat. ( Tidak mungkin untuk mengatakan perbedaannya. ) Anda perlu memeriksa nilai-nilai ini.
Seperti inilah bentuk kelas Botol Anda yang baru:
public class Bottle {
private final int height, diameter;
private Cap capType;
public Bottle(final int height, final int diameter, final Cap capType) {
if (diameter < 1) throw new IllegalArgumentException("diameter must be positive");
if (height < diameter) throw new IllegalArgumentException("bottle must be taller than its diameter");
setCapType(capType);
this.height = height;
this.diameter = diameter;
}
public double getVolumeAsCylinder() {
return height * (diameter / 2.0) * Math.PI;
}
public void setCapType(final Cap capType) {
if (capType == null) throw new NullPointerException("capType cannot be null");
this.capType = capType;
}
// potentially more methods...
}