//Revised from objectweb jac
import java.lang.ref.Reference;
import java.lang.ref.ReferenceQueue;
import java.lang.ref.WeakReference;
import java.util.AbstractList;
import java.util.ArrayList;
import java.util.List;
public class WeakList extends AbstractList {
/**
* Reference queue for cleared weak references
*/
private final ReferenceQueue queue = new ReferenceQueue();
private final List list=new ArrayList();
public boolean add(Object o) {
expungeStaleEntries();
return list.add(new ListEntry(o,queue));
}
public Object get(int i) {
expungeStaleEntries();
return ((Reference)list.get(i)).get();
}
public int size() {
//new Exception().printStackTrace();
expungeStaleEntries();
return list.size();
}
public Object remove(int index) {
return ((ListEntry)list.remove(index)).get();
}
/**
* Expunge stale entries from the list.
*/
private void expungeStaleEntries() {
Object r;
while ( (r = queue.poll()) != null) {
ListEntry e = (ListEntry)r;
int i=list.indexOf(r);
if(i!=-1) {
list.remove(i);
}
}
}
private static class ListEntry extends WeakReference {
String objectString;
public ListEntry(Object o,ReferenceQueue queue) {
super(o,queue);
objectString=o.toString();
}
public boolean equals(Object o) {
if(o==null) {
return false;
} else {
if((o instanceof ListEntry)) {
return o.hashCode()==this.hashCode();
} else {
if(this.get()==null) return false;
return this.get().equals(o);
}
}
}
public String toString() {
if(this.get()==null) {
return "'entry "+objectString+" <GARBAGED>'";
} else {
return "'entry "+this.get()+"'";
}
}
}
}
|