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

Reply via email to