Jangan gunakan public
bidang
Jangan gunakan public
bidang ketika Anda benar-benar ingin membungkus perilaku internal kelas. Ambil java.io.BufferedReader
contoh. Ini memiliki bidang berikut:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLF
dibaca dan ditulis dalam semua metode baca. Bagaimana jika kelas eksternal yang berjalan di utas terpisah secara jahat mengubah keadaan skipLF
di tengah pembacaan? BufferedReader
pasti akan rusak.
Gunakan public
bidang
Ambil Point
kelas ini misalnya:
class Point {
private double x;
private double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
public double getX() {
return this.x;
}
public double getY() {
return this.y;
}
public void setX(double x) {
this.x = x;
}
public void setY(double y) {
this.y = y;
}
}
Ini akan membuat menghitung jarak antara dua poin sangat menyakitkan untuk ditulis.
Point a = new Point(5.0, 4.0);
Point b = new Point(4.0, 9.0);
double distance = Math.sqrt(Math.pow(b.getX() - a.getX(), 2) + Math.pow(b.getY() - a.getY(), 2));
Kelas tidak memiliki perilaku selain pengambil dan setter polos. Dapat diterima untuk menggunakan bidang publik ketika kelas hanya mewakili struktur data, dan tidak memiliki, dan tidak akan pernah memiliki perilaku (getter dan setter yang tipis tidak dianggap sebagai perilaku di sini). Dapat ditulis lebih baik dengan cara ini:
class Point {
public double x;
public double y;
public Point(double x, double y) {
this.x = x;
this.y = y;
}
}
Point a = new Point(5.0, 4.0);
Point b = new Point(4.0, 9.0);
double distance = Math.sqrt(Math.pow(b.x - a.x, 2) + Math.pow(b.y - a.y, 2));
Bersih!
Tapi ingat: Tidak hanya kelas Anda harus absen dari perilaku, tetapi juga harus memiliki tidak alasan untuk memiliki perilaku di masa depan juga.
(Inilah yang dijelaskan jawaban ini . Mengutip "Konvensi Kode untuk Bahasa Pemrograman Java: 10. Praktek Pemrograman" :
Salah satu contoh variabel instance publik yang sesuai adalah kasus di mana kelas pada dasarnya adalah struktur data, tanpa perilaku. Dengan kata lain, jika Anda akan menggunakan struct
bukan kelas (jika Java didukung struct
), maka itu tepat untuk membuat variabel instance kelas publik.
Jadi dokumentasi resmi juga menerima praktik ini.)
Selain itu, jika Anda lebih yakin bahwa anggota Point
kelas di atas tidak dapat diubah, maka Anda dapat menambahkan final
kata kunci untuk menegakkannya:
public final double x;
public final double y;