Java tutorial
/* * Copyright (c) 1998 - 2005 Versant Corporation * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Versant Corporation - initial API and implementation */ import java.util.HashSet; import java.util.List; import java.util.ArrayList; import java.util.Iterator; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; import java.lang.ref.Reference; /** * This maintains a bag of weakly referenced objects. The clean method * must be called from time to time to get rid of the objects that the * garbage collector wants to nuke. This class is not synchronized. */ public final class WeakBag { private HashSet set = new HashSet(); private ReferenceQueue refQueue = new ReferenceQueue(); public WeakBag() { } /** * Add o to the bag and return the WeakReference that can be used to * remove it. */ public WeakReference add(Object o) { WeakReference ans = new WeakReference(o, refQueue); set.add(ans); return ans; } /** * Remove o from the bag. */ public void remove(Reference o) { set.remove(o); } /** * Get the approximate number of objects in the bag. */ public int size() { return set.size(); } /** * Get all the objects still in the bag. */ public List values() { ArrayList a = new ArrayList(set.size()); for (Iterator i = set.iterator(); i.hasNext();) { WeakReference r = (WeakReference) i.next(); Object o = r.get(); if (o != null) a.add(o); } return a; } /** * Get rid of objects in the bag that the garbage collector wants to * nuke. This does not block. */ public void clean() { for (;;) { Object r = refQueue.poll(); if (r == null) return; set.remove(r); } } }