WeakBag.java Source code

Java tutorial

Introduction

Here is the source code for WeakBag.java

Source

/*
 * 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);
        }
    }

}