What is the finalize method in Java?
sobes.tech AI
Answer from AI
The finalize() method in Java is a protected method of the Object class, called by the garbage collector before an object is removed from memory.
Its purpose is to perform cleanup operations for resources (such as closing files or network connections) specific to that object.
Example of usage (deprecated approach):
class MyResource {
private FileInputStream file;
public MyResource(String path) throws IOException {
this.file = new FileInputStream(path);
}
@Override
protected void finalize() throws Throwable {
System.out.println("Calling finalize()");
if (file != null) {
file.close(); // Attempt to close resource
}
super.finalize(); // Important to call super.finalize()
}
}
Features of finalize():
- It is not guaranteed when or if it will be called. The garbage collector may not invoke it at all.
- Its execution blocks garbage collection for the object until the method completes.
- It can resurrect the object if, within
finalize(), the object becomes accessible from live code. - Execution of
finalize()occurs in a separate thread (finalizer), which can cause performance and concurrency issues. - Throwing an exception inside
finalize()is ignored and results in a silent termination of the method.
Modern alternatives to finalize():
-
try-with-resourcesandAutoCloseable: The recommended way to manage resources. Ensures resources are closed even when exceptions occur.try (FileInputStream file = new FileInputStream("path/to/file")) { // Work with the file } catch (IOException e) { // Handle exception } -
Cleaner(a class injava.lang.ref): A more flexible and controllable way to perform cleanup operations, not relying on unreliablefinalize().
Due to its unpredictability and drawbacks, the use of finalize() is highly not recommended in new code. It should be considered an outdated mechanism.