- All Implemented Interfaces:
- RefCounted<T>
public final class Ref<T>
extends java.lang.Object
implements RefCounted<T>
An object that needs ref counting does the two following:
- defines a Tidy object that will cleanup once it's gone,
(this must retain no references to the object we're tracking (only its resources and how to clean up))
Then, one of two options:
1) Construct a Ref directly pointing to it, and always use this Ref; or
2)
- implements RefCounted
- encapsulates a Ref, we'll call selfRef, to which it proxies all calls to RefCounted behaviours
- users must ensure no references to the selfRef leak, or are retained outside of a method scope.
(to ensure the selfRef is collected with the object, so that leaks may be detected and corrected)
This class' functionality is achieved by what may look at first glance like a complex web of references,
but boils down to:
Target --> selfRef --> [Ref.State] <--> Ref.GlobalState --> Tidy
^
|
Ref ----------------------------------------
|
Global -------------------------------------
So that, if Target is collected, Impl is collected and, hence, so is selfRef.
Once ref or selfRef are collected, the paired Ref.State's release method is called, which if it had
not already been called will update Ref.GlobalState and log an error.
Once the Ref.GlobalState has been completely released, the Tidy method is called and it removes the global reference
to itself so it may also be collected.