JavaRush /จาวาบล็อก /Random-TH /Getters และการห่อหุ้มที่แตกหัก
Vadelic
ระดับ
Пасадена

Getters และการห่อหุ้มที่แตกหัก

เผยแพร่ในกลุ่ม
ขณะแก้ไขปัญหา ฉันพบพฤติกรรมที่ไม่คาดคิดของผู้ได้รับ ในการบรรยายที่นี่และแม้แต่ใน getters ที่สร้างโดย IntelliJ IDEA จะใช้รูปแบบที่ง่ายที่สุด: public final class A { private A field; public A getField() { return field; } public void setField(A field) { this.field = field; } } หากฟิลด์นั้นเป็นประเภทดั้งเดิมหรือสตริงซึ่งถูกส่งผ่านตามค่า ทุกอย่างก็จะเรียบร้อย แต่ถ้าวัตถุถูกส่งผ่านโดยการอ้างอิง ปรากฎว่าผ่าน getter คุณสามารถเข้าถึงฟิลด์ได้อย่างเต็มที่ ซึ่งจะทำให้ระดับการเข้าถึงที่ได้รับการป้องกันที่ตั้งไว้เป็นโมฆะ หากตัวตั้งค่ามีเงื่อนไขความถูกต้องใดๆ ก็สามารถข้ามผ่าน getter ดังกล่าวได้ ซึ่งละเมิดการห่อหุ้ม และมันจะเป็นการถูกต้องที่จะสร้างโคลนของอ็อบเจ็กต์เพื่อหลีกเลี่ยงปัญหานี้ ฉันเข้าใจว่าไม่ใช่ว่าวัตถุทั้งหมดจะสามารถโคลนได้ง่าย และหากสิ่งนี้ถูกปล่อยให้เป็นความรับผิดชอบของโปรแกรมเมอร์ ก็แปลกว่าทำไมไม่มีการเอ่ยถึงสิ่งนี้ในการบรรยายเลย UPD: แน่นอนว่า getter เป็นแนวคิดไม่ได้ละเมิดการห่อหุ้ม แต่จะต้องเขียนในลักษณะที่จะไม่หักหลังหลักการของ OOP ซึ่งหมายความว่าหาก getter สร้างอ็อบเจ็กต์ขึ้นมา มันจะทำในลักษณะที่ผู้ใช้ไม่สามารถเปลี่ยนแปลงมันด้วยวิธีอื่นใดที่ระบุไว้ในคลาสได้ มีวิธีการที่ยอดเยี่ยมในคลาส Collections ที่สร้างคอลเลกชันแบบอ่านอย่างเดียว สิ่งนี้ทำให้เกิดข้อจำกัดอื่นๆ หลายประการ เช่น ความเป็นไปไม่ได้ในการเรียงลำดับ แต่สำหรับกรณีนี้ คลาสนี้มี: unmodifiableSortedSet unmodifiableSortedMap และอีกสองสามอย่าง เพื่อความสะดวกยิ่งขึ้น public static Collection unmodifiableCollection(Collection c)
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION