Jangan gunakan publicbidang
Jangan gunakan publicbidang ketika Anda benar-benar ingin membungkus perilaku internal kelas. Ambil java.io.BufferedReadercontoh. Ini memiliki bidang berikut:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLFdibaca dan ditulis dalam semua metode baca. Bagaimana jika kelas eksternal yang berjalan di utas terpisah secara jahat mengubah keadaan skipLFdi tengah pembacaan? BufferedReaderpasti akan rusak.
Gunakan publicbidang
Ambil Pointkelas 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 structbukan 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 Pointkelas di atas tidak dapat diubah, maka Anda dapat menambahkan finalkata kunci untuk menegakkannya:
public final double x;
public final double y;