สิ่งนี้ควรจะเลิกใช้กับ JAVA 9 แล้ว!
ใช้java.util.Cleaner
แทน! (หรือsun.misc.Cleaner
บน JRE รุ่นเก่า)
โพสต์ต้นฉบับ:
ฉันพบว่าการใช้ PhantomReferences มีข้อผิดพลาดเกือบเท่ากันกับวิธี Finalizer (แต่จะมีปัญหาน้อยลงเมื่อคุณทำให้ถูกต้อง) ฉันได้เขียนโซลูชันขนาดเล็ก (เฟรมเวิร์กขนาดเล็กมากที่จะใช้ PhantomReferences) สำหรับ Java 8 ซึ่งอนุญาตให้ใช้นิพจน์แลมบ์ดาเป็นการเรียกกลับเพื่อเรียกใช้หลังจากที่วัตถุถูกลบ คุณสามารถลงทะเบียนการเรียกกลับสำหรับทรัพยากรภายในที่ควรปิด ด้วยสิ่งนี้ฉันได้พบวิธีแก้ปัญหาที่เหมาะกับฉันเพราะมันทำให้มันใช้งานได้จริงมากขึ้น
https://github.com/claudemartin/java-cleanup
นี่คือตัวอย่างเล็ก ๆ เพื่อแสดงวิธีการลงทะเบียนการโทรกลับ:
class Foo implements Cleanup {
public Foo() {
this.registerCleanup((value) -> {
try {
value.close();
} catch (Exception e) {
logger.warning("closing resource failed", e);
}
}, this.resource);
}
จากนั้นมีวิธีที่ง่ายกว่าสำหรับการปิดอัตโนมัติโดยทำเช่นเดียวกับด้านบน:
this.registerAutoClose(this.resource);
เพื่อตอบคำถามของคุณ:
[แล้วมันใช้อะไร]
คุณไม่สามารถล้างบางสิ่งที่ไม่มีอยู่จริงได้ แต่อาจมีทรัพยากรที่ยังคงมีอยู่และจำเป็นต้องได้รับการทำความสะอาดเพื่อให้สามารถลบออกได้
แต่การใช้แนวคิด / คลาสนี้คืออะไร?
ไม่จำเป็นต้องทำอะไรที่มีผลกระทบอื่นใดนอกจากการดีบัก / การบันทึก หรืออาจจะเป็นสถิติ ฉันเห็นว่ามันเหมือนบริการแจ้งเตือนจาก GC มากกว่า คุณยังสามารถใช้เพื่อลบข้อมูลรวมที่ไม่เกี่ยวข้องเมื่อลบออบเจ็กต์ (แต่อาจมีวิธีแก้ไขที่ดีกว่านี้) ตัวอย่างมักกล่าวถึงการเชื่อมต่อฐานข้อมูลที่จะปิด แต่ฉันไม่เห็นว่านี่เป็นความคิดที่ดีอย่างไรเนื่องจากคุณไม่สามารถทำงานกับธุรกรรมได้ กรอบแอปพลิเคชันจะให้ทางออกที่ดีกว่ามากสำหรับสิ่งนั้น
คุณเคยใช้สิ่งนี้ในโครงการของคุณหรือคุณมีตัวอย่างที่เราควรใช้สิ่งนี้หรือไม่? หรือแนวคิดนี้ทำขึ้นเพื่อมุมมองการสัมภาษณ์เท่านั้น;)
ฉันใช้มันเป็นส่วนใหญ่เพื่อการบันทึก ดังนั้นฉันจึงสามารถติดตามองค์ประกอบที่ถูกลบออกและดูว่า GC ทำงานอย่างไรและสามารถปรับแต่งได้ ฉันจะไม่เรียกใช้โค้ดที่สำคัญด้วยวิธีนี้ หากจำเป็นต้องปิดบางสิ่งก็ควรทำในคำสั่ง try-with-resource-statement และฉันใช้มันในการทดสอบหน่วยเพื่อให้แน่ใจว่าฉันไม่มีหน่วยความจำรั่วไหล แบบเดียวกับที่ jontejj ทำ แต่วิธีการแก้ปัญหาของฉันค่อนข้างกว้างกว่าเล็กน้อย