On 10/14/2015 04:23 PM, Alan Bateman wrote:
On 14/10/2015 15:03, Roger Riggs wrote:
Hi Alan,
So any user of the Cleaner can take advantage of the mechanism, for
example in a different package or module.
For example, Netbeans.
Cleaner + Cleanable need to be public of course so maybe we should
wait for the examples that extend WeakCleanableRef or cast the
Cleanable to a WeakCleanableRef before seeing if this is the right
thing or not.
-Alan
Hi Alan,
I think you are referring to Cleaner.WeakCleanable which is public and
abstract right? Because Cleaner.WeakCleanableRef is private.
Besides being resource-friendly, a WeakCleanable is also a Reference,
which means it has the get() method, so users can access the referent
through it until the Reference is cleared. This can be useful in data
structures where WeakCleanable can be subclassed to hold state that is
needed to remove itself from the data structure and act as a
[Weak|Soft]Reference so that it's referent is accessible through it.
Imagine the following:
public class WeakKey<K> extends WeakCleanable {
private final hash;
private final ConcurrentHashMap<WeakKey<K>, ?> map;
public WeakKey(K key, Cleaner c, ConcurrentHashMap<WeakKey<K>, ?>
map) {
super(key, c);
this.hash = key.hashCode();
this.map = map;
}
public int hashCode() { return hash; }
public boolean equals(Object obj) {
if (!(obj instanceof WeakKey)) return false;
K key = get();
if (key == null) return obj == this;
return key == ((WeakKey<?>)obj).get();
}
@Override protected void performCleanup() {
map.remove(this);
}
}
...
ConcurrentHashMap<WeakKey<K>, Data> map = ...
Cleaner cleaner = ...
K key = ...
Data data = ...
map.put(new WeakKey<>(key, cleaner, map), data);
Voila, you have a background-auto-cleaning ConcurrentWeakHashMap-like
data structure.
Regards, Peter