You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@commons.apache.org by "l0co (JIRA)" <ji...@apache.org> on 2013/05/08 15:15:16 UTC

[jira] [Commented] (COLLECTIONS-467) LRUMap remove callback

    [ https://issues.apache.org/jira/browse/COLLECTIONS-467?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13651869#comment-13651869 ] 

l0co commented on COLLECTIONS-467:
----------------------------------

Suggested implementation with example usage:

{code}
public class LRUMap extends org.apache.commons.collections.map.LRUMap {

	public LRUMap() {
		super();
	}

	public LRUMap(int maxSize) {
		super(maxSize);
	}

	public LRUMap(int maxSize, boolean scanUntilRemovable) {
		super(maxSize, scanUntilRemovable);
	}

	public LRUMap(int maxSize, float loadFactor) {
		super(maxSize, loadFactor);
	}

	public LRUMap(int maxSize, float loadFactor, boolean scanUntilRemovable) {
		super(maxSize, loadFactor, scanUntilRemovable);
	}

	public LRUMap(Map map) {
		super(map);
	}

	public LRUMap(Map map, boolean scanUntilRemovable) {
		super(map, scanUntilRemovable);
	}

	@Override
	protected void removeEntry(HashEntry entry, int hashIndex, HashEntry previous) {
		onRemove(entry.getKey(), entry.getValue());
		super.removeEntry(entry, hashIndex, previous);
	}

	@Override
	protected void addEntry(HashEntry entry, int hashIndex) {
		onAdd(entry.getKey(), entry.getValue());
		super.addEntry(entry, hashIndex);
	}

	@Override
	public void clear() {
		for (MapIterator i=mapIterator(); i.hasNext(); ) {
			i.next();
			onRemove(i.getKey(), i.getValue());
		}

		super.clear();
	}

	@Override
	public Object get(Object key) {
		return super.get(key);
	}

	protected void onAdd(Object key, Object value) {
		// to override
	}

	protected void onRemove(Object key, Object value) {
		// to override
	}

	// test
	public static void main(String [] args) {
		LRUMap map = new LRUMap(5) {
			@Override
			protected void onRemove(Object key, Object value) {
				System.out.println("remove: "+key);
			}

			@Override
			protected void onAdd(Object key, Object value) {
				System.out.println("add: "+key);
			}
		};

		for (int i=1; i<=10; i++)
			map.put(i, i);
		map.clear();
	}

}
{code}
                
> LRUMap remove callback
> ----------------------
>
>                 Key: COLLECTIONS-467
>                 URL: https://issues.apache.org/jira/browse/COLLECTIONS-467
>             Project: Commons Collections
>          Issue Type: New Feature
>    Affects Versions: 3.2
>            Reporter: l0co
>            Priority: Minor
>
> If you use LRUMap with objects that require doing some disposal when they are dropped (eg. close()) and you hold these objects only in LRUMap, you cannot do it with current implementation. I propose to add onRemove() and onAdd() methods to the implementation, so that you can create anonymous inherited class and be able to react to these events.

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira