Không được dùng public
các trường
Không sử dụng public
các trường khi bạn thực sự muốn bao bọc hành vi nội bộ của một lớp. Lấy java.io.BufferedReader
ví dụ. Nó có trường sau:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLF
được đọc và viết trong tất cả các phương pháp đọc. Điều gì xảy ra nếu một lớp bên ngoài chạy trong một luồng riêng biệt đã sửa đổi độc hại trạng thái skipLF
ở giữa một lần đọc? BufferedReader
chắc chắn sẽ đi haywire.
Sử dụng public
các lĩnh vực
Lấy Point
lớp này làm ví dụ:
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;
}
}
Điều này sẽ làm cho việc tính khoảng cách giữa hai điểm rất khó viết.
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));
Lớp học không có bất kỳ hành vi nào khác ngoài getters và setters đơn giản. Có thể chấp nhận sử dụng các trường công khai khi lớp chỉ đại diện cho cấu trúc dữ liệu và không có và sẽ không bao giờ có hành vi (getters và setters mỏng không được coi là hành vi ở đây). Nó có thể được viết tốt hơn theo cách này:
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));
Dọn dẹp!
Nhưng hãy nhớ rằng: Không chỉ lớp học của bạn phải vắng mặt trong hành vi, mà nó cũng không có lý do để có hành vi trong tương lai.
(Đây chính xác là những gì câu trả lời này mô tả. Để trích dẫn "Các quy ước mã cho ngôn ngữ lập trình Java: 10. Thực tiễn lập trình" :
Một ví dụ về các biến thể hiện công khai thích hợp là trường hợp lớp về cơ bản là cấu trúc dữ liệu, không có hành vi. Nói cách khác, nếu bạn đã sử dụng struct
thay vì một lớp (nếu được Java hỗ trợ struct
), thì nó phù hợp để biến các biến đối tượng của lớp thành công khai.
Vì vậy, tài liệu chính thức cũng chấp nhận thực hành này.)
Ngoài ra, nếu bạn thêm chắc chắn rằng các thành viên của Point
lớp trên sẽ không thay đổi, thì bạn có thể thêm final
từ khóa để thực thi nó:
public final double x;
public final double y;