โครงสร้างมีสถานที่ของพวกเขาแม้ใน Java คุณควรใช้พวกมันก็ต่อเมื่อสองสิ่งต่อไปนี้เป็นจริง:
- คุณเพียงแค่ต้องรวบรวมข้อมูลที่ไม่มีพฤติกรรมใด ๆ เช่นส่งเป็นพารามิเตอร์
- ไม่สำคัญว่าข้อมูลรวมจะมีค่าเท่าใด
หากเป็นกรณีนี้คุณควรกำหนดให้ฟิลด์นั้นเป็นสาธารณะและข้ามตัวรับสัญญาณ / ตัวตั้งค่า Getters และ setters เป็น clunky อยู่แล้วและ Java เป็นคนโง่ที่ไม่มีคุณสมบัติเช่นภาษาที่มีประโยชน์ เนื่องจากวัตถุที่มีโครงสร้างเหมือนของคุณไม่ควรมีวิธีการใด ๆ อยู่แล้วเขตข้อมูลสาธารณะจึงเหมาะสมที่สุด
อย่างไรก็ตามหากหนึ่งในนั้นไม่มีผลบังคับใช้คุณกำลังติดต่อกับชั้นเรียนจริง นั่นหมายความว่าฟิลด์ทั้งหมดควรเป็นแบบส่วนตัว (ถ้าคุณต้องการฟิลด์ในขอบเขตที่สามารถเข้าถึงได้มากขึ้นให้ใช้ getter / setter)
เพื่อตรวจสอบว่ามีโครงสร้างของคุณควรมีลักษณะการทำงานดูที่เมื่อมีการใช้เขตข้อมูล หากดูเหมือนว่าละเมิดการบอกอย่าถามคุณต้องย้ายพฤติกรรมดังกล่าวไปยังชั้นเรียนของคุณ
หากข้อมูลบางส่วนของคุณไม่ควรเปลี่ยนแปลงคุณจะต้องทำให้ฟิลด์ทั้งหมดเหล่านั้นเป็นที่สิ้นสุด คุณอาจจะพิจารณาการทำชั้นเรียนของคุณไม่เปลี่ยนรูป หากคุณต้องการตรวจสอบข้อมูลของคุณจากนั้นให้ตรวจสอบความถูกต้องในตัวตั้งค่าและตัวสร้าง (เคล็ดลับที่มีประโยชน์คือการกำหนด setter ส่วนตัวและแก้ไขฟิลด์ของคุณภายในคลาสของคุณโดยใช้ setter นั้นเท่านั้น)
ตัวอย่างขวดของคุณน่าจะล้มเหลวในการทดสอบทั้งคู่ คุณสามารถมีรหัส (contrived) ที่มีลักษณะดังนี้:
public double calculateVolumeAsCylinder(Bottle bottle) {
return bottle.height * (bottle.diameter / 2.0) * Math.PI);
}
แต่มันควรจะเป็น
double volume = bottle.calculateVolumeAsCylinder();
ถ้าคุณเปลี่ยนความสูงและเส้นผ่าศูนย์กลางมันจะเป็นขวดเดียวกันหรือไม่? อาจจะไม่. สิ่งเหล่านั้นควรเป็นที่สิ้นสุด ค่าลบตกลงสำหรับเส้นผ่านศูนย์กลางหรือไม่ ขวดของคุณจะต้องสูงกว่าความกว้างหรือไม่ หมวกสามารถเป็นโมฆะได้หรือไม่ ไม่มี? คุณตรวจสอบเรื่องนี้อย่างไร สมมติว่าลูกค้านั้นโง่หรือชั่ว ( เป็นไปไม่ได้ที่จะบอกความแตกต่าง ) คุณต้องตรวจสอบค่าเหล่านี้
นี่คือลักษณะคลาสขวดใหม่ของคุณ:
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...
}