อย่าใช้public
ฟิลด์
อย่าใช้public
ฟิลด์เมื่อคุณต้องการห่อพฤติกรรมภายในของชั้นเรียน ใช้java.io.BufferedReader
ตัวอย่างเช่น มีฟิลด์ต่อไปนี้:
private boolean skipLF = false; // If the next character is a line feed, skip it
skipLF
อ่านและเขียนในวิธีการอ่านทั้งหมด จะเกิดอะไรขึ้นถ้าคลาสภายนอกที่รันในเธรดแยกต่างหากปรับเปลี่ยนสถานะของการเป็นอันตรายระหว่างskipLF
การอ่าน BufferedReader
จะไปยุ่งเหยิงแน่นอน
ใช้public
ฟิลด์
เวลานี้Point
ระดับตัวอย่างเช่น:
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;
}
}
นี่จะทำให้การคำนวณระยะทางระหว่างจุดสองจุดนั้นเจ็บปวดมากในการเขียน
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));
ชั้นไม่มีพฤติกรรมใด ๆ นอกจาก getters และ setters ธรรมดา เป็นที่ยอมรับได้ที่จะใช้เขตข้อมูลสาธารณะเมื่อชั้นแสดงเพียงโครงสร้างข้อมูลและไม่มีและจะไม่มีลักษณะการทำงาน (thin getters และ setters ไม่ถือเป็นพฤติกรรมที่นี่) มันสามารถเขียนได้ดีกว่าด้วยวิธีนี้:
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));
Clean!
แต่จำไว้: ไม่เพียง แต่ระดับของคุณจะต้องขาดของพฤติกรรม แต่มันก็ควรจะมีไม่มีเหตุผลที่จะมีพฤติกรรมในอนาคตได้เป็นอย่างดี
(นี่คือสิ่งที่คำตอบนี้จะอธิบายในการอ้างอิง"ข้อตกลงรหัสสำหรับภาษาการเขียนโปรแกรม Java: 10. วิธีปฏิบัติด้านการเขียนโปรแกรม" :
ตัวอย่างหนึ่งของตัวแปรอินสแตนซ์สาธารณะที่เหมาะสมคือกรณีที่คลาสเป็นโครงสร้างข้อมูลเป็นหลักโดยไม่มีพฤติกรรม กล่าวอีกนัยหนึ่งถ้าคุณจะใช้struct
แทนคลาส (ถ้ารองรับจาวาstruct
) แล้วก็สมควรที่จะทำให้ตัวแปรอินสแตนซ์ของชั้นเรียนเป็นสาธารณะ
ดังนั้นเอกสารอย่างเป็นทางการก็ยอมรับการปฏิบัติเช่นนี้ด้วย)
นอกจากนี้หากคุณแน่ใจเป็นอย่างยิ่งว่าสมาชิกของPoint
กลุ่มที่กล่าวมาจะไม่เปลี่ยนรูปคุณสามารถเพิ่มfinal
คำหลักเพื่อบังคับใช้:
public final double x;
public final double y;