Thomas Hawtin <> wrote:
> The situation in code looks something like this (only with better names):
>
> public class Resource {
> public void doStuff() { ... }
> }
> public class Proxy {
> private final Resource target;
> Proxy(Resource target) {
> if (target == null) {
> throw new NullPointerException();
> }
> this.target = target;
> }
> public void doStuff() {
> target.doStuff();
> }
> }
> class Ref extends Reference<Proxy> {
> private final Resource resource;
> public Ref(Proxy proxy, Resource resource) {
> super(proxy);
> this.resource = resource;
> }
> Resource getResource() {
> return resource;
> }
> }
> class Saver implements Runnable {
> ...
> public void run() {
> for (;
{
> Ref ref = (Ref)queue.remove();
> saveToDisk(ref.getResource());
> }
> }
> }
Where did the SoftReference go?
You never create/pass a ReferenceQueue anywhere.
What about my code below?
- Paul
public interface StrongReference {
Object getAndClearStrong();
}
public class SoftStrongReference extends SoftReference
implements StrongReference {
public SoftStrongReference( Object referrent, ReferenceQueue refQ ) {
super( new Sacrifice(), refQ );
m_referrent = referrent;
}
public Object getAndClearStrong() {
final Object temp = m_referrent;
m_referrent = null;
return temp;
}
private static final class Sacrifice {
}
private Object m_referrent;
}
public interface ObjectSaver {
void save( Object obj );
}
public class ReferenceQueueManager extends Thread {
public ReferenceQueueManager( ObjectSaver saver ) {
setDaemon( true );
m_saver = saver;
m_refQ = new ReferenceQueue();
}
public void kill() {
m_killed = true;
interrupt();
}
public void run() {
while ( !m_killed ) {
try {
final StrongReference ref = (StrongReference)m_refQ.remove();
m_saver.save( ref.getAndClearStrong() );
}
catch ( InterruptedException e ) {
// do nothing
}
}
}
private boolean m_killed;
private final ObjectSaver m_saver;
private final ReferenceQueue m_refQ;
}