เหตุใดไฟล์ต้นฉบับ Java จึงมีชื่อของคลาสสาธารณะที่มีอยู่


14

ฉันเป็นมือใหม่ในการเรียนรู้จาวา ใน Java ไฟล์ต้นฉบับทุกไฟล์ต้องมีคลาสสาธารณะและไฟล์ต้นฉบับนั้นควรมีชื่อเดียวกันกับคลาสสาธารณะนั้น นอกจากนี้ไฟล์ต้นฉบับไม่สามารถมีสองคลาสสาธารณะ ทำไมข้อ จำกัด นี้?


4
นี่คือการออกแบบเชิงประวัติศาสตร์ของวิธีการออกแบบ Java ภาษาที่ออกแบบล่าสุดเช่น C # ในขณะที่คล้ายกับ Java ไม่มีข้อ จำกัด นี้
gahooa

13
ไม่ใช่เพื่อบังคับใช้แนวปฏิบัติที่ดีที่สุดใช่ไหม ฉันคิดว่านี่เป็นเหตุผลเดียว ใน C # คุณไม่มีข้อ จำกัด ในระดับทางเทคนิค แต่ StyleCop ยังคงบ่นหากชื่อไฟล์และชื่อคลาสไม่ตรงกันหรือถ้าคุณมีหลายคลาสในไฟล์เดียวกัน Visual Studio ยังสนับสนุนความสัมพันธ์ของคลาสไฟล์อย่างหนัก (คิดว่าไดอะแกรมคลาสที่สร้างไฟล์ให้คุณหรือเมื่อคุณเปลี่ยนชื่อไฟล์. cs Visual Studio จะถามคุณว่าคุณต้องการสร้างชื่อของคลาสด้วยหรือไม่)
Arseni Mourzenko

ในภาษาที่คอมไพล์แบบเก่าตัวเชื่อมโยงจะค้นหาการอ้างอิงและสัญลักษณ์ภายนอกทั้งหมด แต่ Java ไม่ได้เชื่อมโยงคุณสามารถโหลด jars ในเวลาทำงานได้หากคุณต้องการ หากไม่มีขั้นตอนการเชื่อมโยงการพยายามจับคู่ชื่อคลาสกับสถานที่ใน classpath นั้นจะเร็วกว่ามากหากคุณทราบชื่อไฟล์ที่จะค้นหา
พอลทอมบลิ

4
@gahooa ไม่ใช่สิ่งประดิษฐ์การออกแบบมันเป็นการตัดสินใจออกแบบโดยเจตนา ทำให้หลายสิ่งง่ายขึ้นมาก

1
เกี่ยวกับการใช้grep ?
ผู้ใช้

คำตอบ:


19

ในตอนหนึ่งของจดหมายข่าว Java ผู้เชี่ยวชาญของเขาไฮนซ์ Kabutz ขุดผ่านข้อมูลจำเพาะ Oak ภาษา เขาเขียน:

ทำไมแต่ละคลาสสาธารณะในไฟล์แยกกัน (ส่วนที่ 1)

นี่เป็นคำถามที่ฉันถูกถามบ่อยๆระหว่างเรียน ถึงตอนนี้ฉันยังไม่มีคำตอบที่ดีสำหรับคำถามนี้ ในส่วนที่ 1 เราอ่านว่า: "แม้ว่ายูนิตการรวบรวม Oak แต่ละหน่วยสามารถมีหลายคลาสหรืออินเตอร์เฟซ แต่คลาสหรือส่วนต่อประสานส่วนใหญ่ต่อหนึ่งหน่วยการรวบรวมสามารถเป็นสาธารณะได้"

ในแถบด้านข้างอธิบายว่าทำไม: "ข้อ จำกัด นี้ยังไม่ได้บังคับใช้โดยคอมไพเลอร์แม้ว่าจะจำเป็นสำหรับการนำเข้าแพ็คเกจที่มีประสิทธิภาพ"

เห็นได้ชัดว่าสวย - เหมือนสิ่งส่วนใหญ่เมื่อคุณรู้เหตุผลการออกแบบ - คอมไพเลอร์จะต้องเพิ่มการส่งผ่านหน่วยการคอมไพล์ (ไฟล์. java) ทั้งหมดเพื่อหาว่าคลาสใดอยู่ที่ไหนและนั่นจะทำให้การคอมไพล์ช้าลง .

http://www.javaspecialists.eu/archive/Issue055.html


1
หากต้องการทำให้การคอมไพล์เร็วขึ้นเล็กน้อย ? จริงๆ? ไม่ใช่เพราะมันทำให้รหัสของคุณเป็นระเบียบมากขึ้นใช่ไหม ฉันสงสัยอย่างมากว่านี่คือคำตอบที่ถูกต้อง
BlueRaja - Danny Pflughoeft

1
@ BlueRaja-DannyPflughoeft ในปี 1998 ฉันแน่ใจว่ามันสร้างความแตกต่างที่ใหญ่กว่ามาก
TheLQ

8

เหตุผลที่ฉันคิดได้

  • ทำให้การค้นหาคลาสอื่น ๆ ง่ายขึ้นเล็กน้อยสำหรับคอมไพเลอร์ในตอนแรกเนื่องจากไม่ต้องค้นหาไฟล์คลาสทั้งหมดที่มีอยู่นับพันเพื่อหาคลาสสาธารณะแบบสุ่มมันสามารถไปที่ไฟล์ได้
    • สิ่งนี้อาจไม่สำคัญอีกต่อไป แต่เพิ่งเริ่มต้นการประชุมที่ไม่เคยเปลี่ยนแปลง
  • ในการรวบรวมการเปลี่ยนแปลงไฟล์จะมีผลกับไฟล์นั้นเท่านั้น หากมีหลายคลาสทุกอย่างจะต้องมีการคอมไพล์ใหม่
  • แนวปฏิบัติที่ดีที่สุด - การมีคลาสสาธารณะหลายชั้นในไฟล์เดียวกันทำให้เกิดความสับสน วัตถุประสงค์ของไฟล์คือการจัดระเบียบซอร์สโค้ดวัตถุประสงค์ของโฟลเดอร์คือเพื่อจัดระเบียบไฟล์ หากคลาสทั้งหมดของแพ็กเกจเฉพาะอยู่ในไฟล์ super 100 MB เดียวคุณสูญเสียข้อดีทั้งหมดและไม่ได้รับประโยชน์จากไฟล์ (รวมถึงการเพิ่มความปวดหัวเมื่อแก้ไข)

1
คลาสและอินเทอร์เฟซไม่จำเป็นต้องแสดงถึงระดับที่เป็นธรรมชาติที่สุดของส่วนย่อยสำหรับซอร์สโค้ด การมีโค้ดหลายพันบรรทัดที่ถูกเขียนลงในไฟล์เดียวนั้นไม่สะดวก แต่ก็เช่นกันหากไม่มีหรือมีเนื้อหา "ของจริง" 100 บรรทัด (ยกเว้นความคิดเห็นหรือคำสั่งคอมไพเลอร์ซ้ำ) แพร่กระจายในไฟล์ต้นฉบับโหล ผมสงสัยว่ามันจะทำงานถ้าไฟล์ชื่อสำหรับประเภทมีการอย่างใดอย่างหนึ่งมีความหมายหรืออื่น ๆ ที่ระบุไฟล์ที่ไม่?
supercat
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.