Finalizer থেকে নির্ধারিত resource cleanup
finalization-কে AutoCloseable দিয়ে প্রতিস্থাপন করুন এবং শুধু প্রতিরক্ষামূলক fallback হিসেবে Cleaner ব্যবহার করুন।
কোড তুলনা
✕ Finalization
@Override
protected void finalize() throws Throwable {
nativeHandle.release();
}
✓ Java 9+
final class NativeResource implements AutoCloseable {
private static final Cleaner CLEANER = Cleaner.create();
private static final class State implements Runnable {
private final long handle;
State(long handle) {
this.handle = handle;
}
@Override
public void run() {
release(handle);
}
}
private final Cleaner.Cleanable cleanable;
NativeResource(long handle) {
cleanable = CLEANER.register(this, new State(handle));
}
@Override
public void close() {
cleanable.clean();
}
}
এই কোডে সমস্যা দেখছেন? আমাদের জানান।
কেন আধুনিক পদ্ধতি ভালো
নির্ধারিত
Try-with-resources একটি নির্দিষ্ট সময়ে resource release করে।
নিরাপদ lifecycle
finalizer resurrection এবং অনির্দেশ্য ordering এড়িয়ে যায়।
প্রতিরক্ষামূলক fallback
finalize() override না করেই Cleaner leak হওয়া resource পুনরুদ্ধার করতে পারে।
পুরনো পদ্ধতি
finalize() override করা
আধুনিক পদ্ধতি
AutoCloseable এবং Cleaner
JDK থেকে
9
কঠিনতা
উন্নত
JDK সমর্থন
Finalizer থেকে নির্ধারিত resource cleanup
উপলব্ধ
Cleaner এবং finalization deprecation JDK 9 (সেপ্টেম্বর 2017) থেকে উপলব্ধ
কীভাবে কাজ করে
Finalization অপসারণের জন্য deprecated এবং এটি সময়মতো cleanup বা নির্ভরযোগ্য ordering—কোনোটিই দেয় না। AutoCloseable implement করুন, যাতে caller try-with-resources দিয়ে নির্ধারিতভাবে resource release করতে পারে। leak হওয়া resource-এর জন্য শেষ উপায় হিসেবে Cleaner একই idempotent cleanup action চালাতে পারে; এর action অবশ্যই registered object ধরে রাখবে না।
সম্পর্কিত ডকুমেন্টেশন
প্রমাণ