คุณถูกต้องโดยสมมติว่าการเข้าถึงแอตทริบิวต์ที่มีให้กับคลาสภายในแบบไม่คงที่ทำให้เกิดการเชื่อมต่อสูงดังนั้นคุณภาพของรหัสที่ลดลงและคลาสภายใน(ไม่ใช่แบบไม่ระบุชื่อและไม่ใช่ท้องถิ่น ) ควรเป็นแบบคงที่
การออกแบบที่เกี่ยวข้องกับการตัดสินใจที่จะทำให้ชั้นภายในคงที่อยู่ในJava Puzzlers , Puzzle 90 (ตัวอักษรตัวหนาด้านล่างอ้างเป็นของฉัน):
เมื่อใดก็ตามที่คุณเขียนคลาสสมาชิกให้ถามตัวเองว่าคลาสนี้จำเป็นต้องมีอินสแตนซ์ล้อมรอบหรือไม่? static
ถ้าคำตอบคือไม่ให้มัน บางครั้งชั้นในมีประโยชน์ แต่ก็สามารถแนะนำภาวะแทรกซ้อนที่ทำให้โปรแกรมยากต่อการเข้าใจ พวกเขามีปฏิสัมพันธ์ที่ซับซ้อนกับยาชื่อสามัญ (ปริศนาที่ 89) สะท้อน (ปริศนาที่ 80) และมรดก (ปริศนานี้) ถ้าคุณบอกว่าInner1
เป็นstatic
ปัญหาจะหายไป หากคุณยังประกาศInner2
จะเป็นstatic
คุณจริงสามารถเข้าใจสิ่งที่โปรแกรมไม่: โบนัสที่ดีแน่นอน
โดยสรุปแล้วมันไม่ค่อยเหมาะสำหรับชั้นหนึ่งที่จะเป็นทั้งชั้นในและชั้นย่อยของอีกชั้นหนึ่ง โดยทั่วไปแล้วมันไม่ค่อยเหมาะสมที่จะขยายชั้นใน; ถ้าคุณต้องคิดให้ยาวและหนักเกี่ยวกับอินสแตนซ์ที่แนบมา นอกจากนี้ยังชอบเรียนซ้อนไม่ใช่static
ส่วนใหญ่เรียนสมาชิกสามารถและควรจะได้รับการประกาศstatic
static
หากคุณสนใจการวิเคราะห์รายละเอียดเพิ่มเติมของจิ๊กซอว์ 90ที่ระบุไว้ในคำตอบนี้ที่กองมากเกิน
มันเป็นที่น่าสังเกตว่าข้างต้นเป็นหลักรุ่นที่ขยายของคำแนะนำที่ให้ไว้ในJava คลาสและวัตถุกวดวิชา :
ใช้คลาสที่ไม่คงที่ (หรือคลาสภายใน) หากคุณต้องการเข้าถึงฟิลด์และเมธอดที่ไม่ใช่แบบสาธารณะของอินสแตนซ์ที่ปิดล้อม ใช้คลาสที่ซ้อนกันแบบคงที่หากคุณไม่ต้องการการเข้าถึงนี้
ดังนั้นคำตอบสำหรับคำถามที่คุณถามในคำอื่น ๆต่อการกวดวิชาเป็นเพียงเหตุผลที่น่าเชื่อที่จะใช้ไม่คงที่คือเมื่อมีการเข้าถึงไปยังเขตที่ไม่ใช่แบบสาธารณะตัวอย่างการปิดล้อมและวิธีถูกต้อง
ถ้อยคำของบทเรียนค่อนข้างกว้าง (นี่อาจเป็นเหตุผลว่าทำไม Java Puzzlers พยายามทำให้มันแข็งแกร่งขึ้นและแคบลง) โดยเฉพาะอย่างยิ่งการเข้าถึงฟิลด์อินสแตนซ์ที่ล้อมรอบโดยตรงนั้นไม่จำเป็นสำหรับประสบการณ์ของฉัน - ในแง่ที่ว่าทางเลือกอื่นเช่นการส่งผ่านสิ่งเหล่านี้เป็นพารามิเตอร์คอนสตรัคเตอร์ / เมธอด
โดยรวม, ฉัน (เจ็บปวดมาก) การเผชิญหน้ากับการแก้จุดบกพร่องการเรียนภายในโดยตรงเข้าถึงด้านของการปิดล้อมเช่นสร้างความประทับใจที่แข็งแกร่งที่นี้คล้ายกับการปฏิบัติใช้ของรัฐทั่วโลกพร้อมกับความชั่วร้ายที่รู้จักกันที่เกี่ยวข้องกับมัน
แน่นอน Java สร้างขึ้นเพื่อให้ความเสียหายของ "quasi global" นั้นอยู่ในชั้นเรียนที่ล้อมรอบ แต่เมื่อฉันต้อง debug ชั้นในโดยเฉพาะมันรู้สึกเหมือนตัวช่วยวงไม่ได้ช่วยลดความเจ็บปวด: ฉันยังคงมี เพื่อระลึกไว้ในความหมาย "ต่างประเทศ" และรายละเอียดแทนที่จะมุ่งเน้นการวิเคราะห์วัตถุที่มีปัญหาโดยเฉพาะ
เพื่อความสมบูรณ์อาจมีบางกรณีที่ไม่มีการใช้เหตุผลด้านบน ตัวอย่างเช่นต่อการอ่านmap.keySet javadocsของฉันคุณลักษณะนี้จะแนะนำการมีเพศสัมพันธ์อย่างแน่นหนาและเป็นผลให้อาร์กิวเมนต์ขัดแย้งกับคลาสที่ไม่คงที่:
ส่งคืนSet
มุมมองของคีย์ที่มีอยู่ในแผนที่นี้ ชุดนี้ได้รับการสนับสนุนโดยแผนที่ดังนั้นการเปลี่ยนแปลงของแผนที่จะปรากฎในชุดและในทางกลับกัน ...
ไม่ใช่ว่าข้างต้นจะทำให้รหัสที่เกี่ยวข้องง่ายต่อการบำรุงรักษาทดสอบและตรวจแก้จุดบกพร่องในใจคุณ แต่อย่างน้อยก็อาจอนุญาตให้ใครก็ตามยืนยันว่าภาวะแทรกซ้อนตรงกับ / เป็นธรรมโดยการทำงานที่ตั้งใจไว้