ฉันมีคำถามที่ฉันไม่พบคำตอบยกเว้นคำตอบต่อไปนี้ที่ไม่ตรงกับความต้องการของฉัน:
"เพราะเจมส์กอสลิงไม่ต้องการ"
ฉันรู้ว่า Java สามารถมีอินเตอร์เฟซ (เฉพาะฟังก์ชั่นเสมือนบริสุทธิ์ไม่มีคุณลักษณะ) แต่มันไม่ได้เป็นสิ่งเดียวกันกับคำจำกัดความของชั้นเรียน
ฉันมีคำถามที่ฉันไม่พบคำตอบยกเว้นคำตอบต่อไปนี้ที่ไม่ตรงกับความต้องการของฉัน:
"เพราะเจมส์กอสลิงไม่ต้องการ"
ฉันรู้ว่า Java สามารถมีอินเตอร์เฟซ (เฉพาะฟังก์ชั่นเสมือนบริสุทธิ์ไม่มีคุณลักษณะ) แต่มันไม่ได้เป็นสิ่งเดียวกันกับคำจำกัดความของชั้นเรียน
คำตอบ:
คำตอบต่อไปนี้ที่ไม่เป็นไปตามข้อกำหนดของฉัน: "เพราะ James Gosling ไม่ต้องการ"
นั่นเป็นคำตอบที่ถูกต้อง ทีมงานออกแบบภาษา (กอสลิง, เชอริแดน Naughton ต่อมาบิลจอยเคนอาร์โนล ฯลฯ ) ตัดสินใจที่หัวทำให้เกิดปัญหามากขึ้นกว่าที่พวกเขาได้รับการแก้ไข ดังนั้นพวกเขาจึงออกแบบมันออกมาและแสดงให้เห็นว่าพวกเขาสามารถสร้างภาษาที่มีประโยชน์อย่างสมบูรณ์แบบโดยไม่จำเป็นต้องใช้พวกเขา
จากส่วน 2.2.1 ของเอกสารไวท์ Java Language Environment :
ซอร์สโค้ดที่เขียนด้วย Java นั้นง่ายมาก ไม่มีตัวประมวลผลล่วงหน้าไม่มี #define และความสามารถที่เกี่ยวข้องไม่มี typedef และขาดคุณสมบัติเหล่านั้นไม่จำเป็นต้องใช้ไฟล์ส่วนหัวอีกต่อไป แทนที่จะเป็นไฟล์ส่วนหัวไฟล์ต้นฉบับภาษา Java ให้คำจำกัดความของคลาสอื่น ๆ และวิธีการ
คำจำกัดความซ้ำซ้อนทำให้ไฟล์ซิงค์ข้อมูลคำจำกัดความที่ขัดแย้งกันคำจำกัดความที่ซ่อน - ไม่มีสิ่งเหล่านี้เกิดขึ้นใน Java เพราะคุณไม่มีส่วนหัว หากคุณต้องการดูคำจำกัดความของคลาสเปลือยคุณสามารถสร้างได้จากไฟล์. java โดยตรง - เช่น IDEs ส่วนใหญ่จะแสดงโครงสร้างของคลาสในแถบด้านข้างซึ่งจะรวมเป็นจำนวนเดียวกัน
ไม่จำเป็นต้องใช้ภาษา C ++ เพื่อให้คำจำกัดความของคลาสและการประกาศในไฟล์แยกกัน มันหมายความว่าอย่างน้อยคุณก็สามารถย้อนกลับไปในวัน C ในการแยกวิเคราะห์ในการสแกนบนสุดของรหัส บนเครื่องที่ไม่มีที่เก็บข้อมูลแบบสุ่มนี่เป็นเรื่องใหญ่!
การมีส่วนหัวยังอนุญาตให้คุณเผยแพร่อินเทอร์เฟซไปยังไลบรารีรหัสของคุณโดยการระบุส่วนหัวโดยไม่จำเป็นต้องเปิดเผยซอร์สโค้ด แต่น่าเสียดายที่ใน C ++ คุณยังมีการเปิดเผยข้อมูลส่วนตัวของสมาชิกซึ่งได้นำไปสู่การแก้ปัญหาเช่นสยองขวัญของpimpl
มีความพยายามในการสร้างสภาพแวดล้อม C ++ ที่ทุกอย่างถูกเก็บไว้ในโครงสร้างประเภทฐานข้อมูลและไม่มีไฟล์ แต่มันไม่ได้จับ
เนื่องจากหลักการแห้ง ใน Java ข้อมูลที่จำเป็นในการใช้คลาสในแพ็คเกจ (หรือคลาส) มีอยู่ในไฟล์. class การสร้างไฟล์ส่วนหัวแยกต่างหากที่มีข้อมูลเดียวกันจะเกี่ยวข้องกับการทำซ้ำในสองแห่ง
ในทุกภาษา - มีสองขั้นตอนสำหรับการสร้างรหัสไบนารีสุดท้าย - การรวบรวมและการเชื่อมโยง (แน่นอนว่ามีการโหลด แต่ที่ไม่มีผลกระทบมากที่นี่) ในช่วงเวลาของการรวบรวมเราจะต้องใส่hooks (สเปคของฟังก์ชั่นที่จะถูกเรียก) ในสถานที่ที่เหมาะสม Linker เข้าร่วมพวกเขาจริงเมื่อทั้งสองรหัสจริงสามารถใช้ได้ จนถึงขณะนี้ยังไม่มีความแตกต่างระหว่าง C ++ และ Java
มีเป็นอย่างไรความจำเป็นสำหรับ C ++ ที่จะมีการประกาศและความหมายที่แยกต่างหาก หากคุณยังคงใช้งานในส่วนหัวและหากไฟล์ส่วนหัวมีการเปลี่ยนแปลงรหัสที่เชื่อมโยงกับมันจะต้องได้รับการคอมไพล์ใหม่ โดยที่ราวกับว่าคำจำกัดความอยู่ในไฟล์แยกต่างหากรหัสจะต้องเชื่อมโยงใหม่อีกครั้งเท่านั้น
เข้าใจว่า C ++ มีตัวเลือกสำหรับการเชื่อมโยงแบบสแตติกซึ่งหมายความว่ารหัสวัตถุได้รับการแก้ไขพร้อมกับแอปพลิเคชันการโทร โปรดทราบว่าทั้งใน C และ C ++ มันไม่ถูกต้องที่จะมีการเขียนโปรแกรมในไฟล์ส่วนหัวหรือแม้กระทั่งทำ #include หมายความว่าคุณต้องกังวลเกี่ยวกับการเชื่อมโยงที่เกิดขึ้นกับไฟล์วัตถุเหล่านี้เท่านั้น
สถานการณ์ใน Java นั้นแตกต่างกันมาก แต่ละคลาสไฟล์จะถูกคอมไพล์ด้วยไฟล์. class แท้จริงแล้วความจำเป็นในการรวบรวมฟังก์ชั่นระดับผู้โทรซึ่งทำหน้าที่เป็นส่วนหัวในไฟล์. class อย่างไรก็ตามในการเชื่อมโยง Java ขั้นสุดท้ายจะทำเฉพาะใน Runtime (เครื่องเสมือน) เท่านั้นที่มีการกำหนดคุณสมบัติของรหัสไบต์ของไฟล์คลาส
อินเทอร์เฟซและการรวมอย่างมีประสิทธิภาพเป็นส่วนหัว คำจำกัดความจึงเหมือนกับไบนารีและไม่สามารถซิงค์ได้ นี่เป็นหนึ่งในการตัดสินใจออกแบบที่ดีที่สุดใน Java แต่ก็เป็นเรื่องน่ารำคาญเล็กน้อยที่ไม่มีทางที่จะรวมการประกาศเหล่านี้ไว้สำหรับความกะทัดรัดและความมั่นคง
เหตุผลหนึ่งที่ควรมีคือการแยกรหัสที่คุณอาจต้องการนำมาใช้ใหม่ (เช่นคำจำกัดความทั่วไป) จากรหัสที่เฉพาะเจาะจงสำหรับโครงการที่กำหนด Java ต้องการให้คุณระบุเพียงคลาสเดียวหรืออินเตอร์เฟสต่อไฟล์และส่วนใหญ่จะลดความจำเป็นในการรวมส่วนหัวไว้เพราะคุณจะทำให้ส่วนที่แชร์อยู่ในไฟล์ของตัวเองมีอยู่แล้ว
นอกจากนี้คอมไพเลอร์และบิลด์อาจต้องการแคชส่วนหัวที่คอมไพล์แล้วเพื่อหลีกเลี่ยงการแยกวิเคราะห์มากกว่าหนึ่งครั้ง