How does a “finalizer guardian” work in java?

后端 未结 1 636
青春惊慌失措
青春惊慌失措 2020-12-31 07:32

How does a \"finalizer guardian\" [Effective Java , page 30] work ?

Have you used them? Did it solve any specific problem ?

相关标签:
1条回答
  • 2020-12-31 08:08

    It solves the problem of the sub-class forgetting to call the finalize method of the super-class. This pattern works by attaching an extra instance with overridden finalize to your super-class. This way, if the super-class goes out of scope, the attached instance would also go out of scope, which would trigger the execution of its finalize, which would in turn call the finalize of the enclosing class.

    Here is a short snippet that showcases the guardian pattern in action:

    public class Parent {
    
        public static void main(final String[] args) throws Exception {
            doIt();
            System.gc();
            Thread.sleep(5000); //  5 sec sleep
        }
    
        @SuppressWarnings("unused")
        private final Object guardian = new Object() {
            @Override protected void finalize() {
                doFinalize();
            }
        };
    
        private void doFinalize() {
            System.out.println("Finalize of class Parent");
        }
    
        public static void doIt() {
            Child c = new Child();
            System.out.println(c);
        }
    
    }
    
    class Child extends Parent {
    
        // Note, Child class does not call super.finalize() but the resources held by the
        // parent class will still get cleaned up, thanks to the guardian pattern
        @Override protected void finalize() {
            System.out.println("Finalize of class Child");
        }
    
    }
    
    0 讨论(0)
提交回复
热议问题