ฉันแก่แล้ว ฉันเคยไปที่นั่นและเห็นมันและกระแทกหัวของฉันเกี่ยวกับเรื่องนี้หลายครั้ง
ฉันอยู่ที่การประชุมที่ Hursley Park ที่ซึ่งเด็ก ๆ ไอบีเอ็มบอกเราว่าภาษาจาวาใหม่นี้ยอดเยี่ยมแค่มีคนถามว่า ... ทำไมไม่มีตัวทำลายสำหรับวัตถุเหล่านี้ เขาไม่ได้หมายถึงสิ่งที่เรารู้ว่าเป็นผู้ทำลายล้างใน C ++ แต่ก็ไม่มีผู้เข้ารอบสุดท้าย (หรือมีผู้เข้ารอบสุดท้าย แต่โดยทั่วไปแล้วพวกเขาไม่ได้ทำงาน) นี่คือวิธีย้อนกลับไปและเราตัดสินใจว่า Java เป็นภาษาของเล่นสักหน่อย ณ จุดนั้น
ตอนนี้พวกเขาเพิ่ม Finalisers ให้กับสเป็คภาษา
แน่นอนว่าต่อมาทุกคนได้รับคำสั่งไม่ให้นำผู้เข้ารอบสุดท้ายเข้ามาในวัตถุเพราะมันทำให้ GC ช้าลงอย่างมาก (เนื่องจากไม่เพียง แต่ต้องล็อคฮีป แต่ย้ายวัตถุที่จะเสร็จสิ้นไปยังพื้นที่ชั่วคราวเนื่องจากวิธีการเหล่านี้ไม่สามารถเรียกได้ว่า GC ได้หยุดแอปชั่วคราวจากการทำงาน แต่จะเรียกทันทีก่อนหน้าถัดไป รอบ GC) (และที่แย่กว่านั้นบางครั้งผู้เข้ารอบจะไม่ถูกเรียกเลยเมื่อแอปปิดตัวลงลองนึกภาพว่าคุณไม่ได้ปิดการจัดการไฟล์เลย)
จากนั้นเรามี C # และฉันจำฟอรัมสนทนาใน MSDN ที่เราบอกว่าภาษา C # ใหม่นี้วิเศษเพียงใด มีคนถามว่าทำไมไม่มีการสรุปที่แน่นอนและเด็กชาย MS บอกเราว่าเราไม่ต้องการสิ่งนั้นแล้วบอกเราว่าเราต้องเปลี่ยนวิธีการออกแบบแอพของเราแล้วบอกเราว่า GC น่าทึ่งแค่ไหนและแอปเก่าทั้งหมดของเราเป็นอย่างไร ขยะและไม่เคยทำงานเพราะการอ้างอิงแบบวงกลมทั้งหมด จากนั้นพวกเขายุบตัวลงเพื่อกดดันและบอกกับเราว่าพวกเขาได้เพิ่มรูปแบบ IDispose นี้ให้กับสเป็คที่เราสามารถใช้ได้ ฉันคิดว่ามันค่อนข้างกลับไปสู่การจัดการหน่วยความจำด้วยตนเองสำหรับเราในแอป C # ณ จุดนั้น
แน่นอนเด็กชาย MS ค้นพบในภายหลังว่าสิ่งที่พวกเขาบอกกับเราคือ ... พวกเขาทำให้ IDispose มากกว่าอินเทอร์เฟซมาตรฐานและเพิ่มคำสั่งการใช้ในภายหลัง w00t! พวกเขาตระหนักดีว่าการกำหนดขั้นสุดท้ายแบบกำหนดแน่นอนนั้นเป็นสิ่งที่ขาดหายไปจากภาษา แน่นอนคุณยังต้องจำไว้ว่าให้ใส่มันทุกที่ดังนั้นมันยังคงเป็นคู่มือเล็กน้อย แต่จะดีกว่า
แล้วทำไมพวกเขาถึงทำเมื่อพวกเขาสามารถใช้ซีแมนทิกส์สไตล์ที่ใช้ในแต่ละช่วงบล็อกตั้งแต่เริ่มต้น อาจมีประสิทธิภาพ แต่ฉันชอบที่จะคิดว่าพวกเขาไม่ได้ตระหนักถึง เช่นเดียวกับในที่สุดพวกเขาก็ตระหนักว่าคุณยังคงต้องการตัวชี้อัจฉริยะใน. NET (google SafeHandle) พวกเขาคิดว่า GC จะแก้ปัญหาทั้งหมดได้จริง พวกเขาลืมว่าวัตถุเป็นมากกว่าหน่วยความจำและ GC นั้นถูกออกแบบมาเพื่อจัดการกับหน่วยความจำเป็นหลัก พวกเขาสับสนกับแนวคิดที่ว่า GC จะจัดการเรื่องนี้และลืมว่าคุณใส่สิ่งอื่นเข้าไปในนั้นวัตถุไม่ได้เป็นเพียงแค่หน่วยความจำที่ไม่สำคัญถ้าคุณไม่ลบออกไปซักพัก
แต่ฉันก็คิดว่าการขาดวิธีการสุดท้ายใน Java ดั้งเดิมนั้นมีมากกว่านั้น - วัตถุที่คุณสร้างล้วนเกี่ยวกับความทรงจำและถ้าคุณต้องการลบอย่างอื่น (เช่นตัวจัดการ DB หรือซ็อกเก็ตหรืออะไรก็ตาม) ) แล้วคุณคาดว่าจะทำด้วยตนเอง
จำไว้ว่า Java ถูกออกแบบมาสำหรับสภาพแวดล้อมแบบฝังตัวที่ผู้คนเคยเขียนโค้ด C พร้อมกับการจัดสรรด้วยตนเองจำนวนมากดังนั้นการไม่มีระบบอัตโนมัติฟรีจึงไม่เป็นปัญหามากนัก - พวกเขาไม่เคยทำมาก่อนดังนั้นทำไมคุณต้องใช้ Java? ปัญหาไม่ได้เกี่ยวอะไรกับเธรดหรือสแต็ค / ฮีปอาจเป็นเพียงแค่การจัดสรรหน่วยความจำ โดยรวมแล้วคำสั่งลอง / สุดท้ายน่าจะเป็นสถานที่ที่ดีกว่าในการจัดการทรัพยากรที่ไม่ใช่หน่วยความจำ
ดังนั้น IMHO วิธีที่. NET คัดลอกข้อบกพร่องที่ใหญ่ที่สุดของ Java ก็คือจุดอ่อนที่ยิ่งใหญ่ที่สุด .NET ควรเป็น C ++ ที่ดีกว่าไม่ใช่ Java ที่ดีกว่า