Cleaner Class คืออะไร?
Java 9 เพิ่ม java.lang.ref.Cleaner เป็นตัวเลือกแทน finalize() ที่ถูก deprecated จัดการ cleanup actions เมื่อ object ถูก garbage collect
วิธีการทำงาน
- สร้าง Cleaner instance ด้วย
Cleaner.create() - Register object พร้อม cleaning action (Runnable) ด้วย
cleaner.register(obj, action) - เมื่อ object กลายเป็น eligible สำหรับ GC -> cleaning action จะถูกเรียก
ตัวอย่าง
import java.lang.ref.Cleaner;
public class CleanerTest {
public static void main(String args[]) {
System.out.println("TutorialsPoint");
Cleaner cleaner = Cleaner.create();
if(true) {
CleanerTest myObject = new CleanerTest();
cleaner.register(myObject, new State()); // register cleaner
}
// สร้าง object มากๆ เพื่อกระตุ้น GC
for(int i = 1; i <= 10000; i++) {
String[] largeObject = new String[1000];
try { Thread.sleep(1); } catch(InterruptedException e) { e.printStackTrace(); }
}
}
private static class State implements Runnable {
public void run() {
System.out.print("Cleaning action");
}
}
}
Output
TutorialsPoint Cleaning action
ข้อดีของ Cleaner vs finalize()
- แยก cleanup logic ออกจาก object (separation of concerns)
- ควบคุม thread ของ cleanup ได้ (Cleaner ใช้ dedicated thread)
- ไม่มีปัญหา finalization ordering และ resurrection
- มีประสิทธิภาพและ predictable มากกว่า
สรุป
Cleaner ให้กลไกจัดการ resource cleanup ที่ทันสมัยและน่าเชื่อถือกว่า finalize() ควรใช้ใน Java 9+