Как сделать прослушиватель, который прослушивает изменения в TreeMap?

Я делаю графический интерфейс, который спрягает испанские глаголы. Он использует TreeMap в качестве основной структуры данных, которая заполнена экземплярами класса Verb. Каждое воплощение включает строку, содержащую инфинитивную форму глагола, например «hablar» или «escribir». В графическом интерфейсе есть функция, которая позволяет пользователю вводить новый глагол, вводя его инфинитив и его английский перевод.

Я хочу знать, как создать прослушиватель, который будет запускать некоторый код каждый раз, когда новый глагол добавляется или удаляется из TreeMap. Как мне это сделать?


person idungotnosn    schedule 25.07.2011    source источник
comment
Хороший вопрос. Это похоже на то, что может быть полезно. Я не верю, что видел это раньше, но вы могли бы создать подкласс класса и создать свой собственный.   -  person Nicholas    schedule 25.07.2011


Ответы (1)


Вы можете создать подкласс класса TreeMap, например.

public class MyTreeMap<K, V> extends TreeMap<K, V> {
    @Override
    public V put(K key, V val) {
        V ret = super.put(key, val);
        myAddCallback(key, val);
        return ret;
    }

    @Override
    public V remove(K key) {
        V ret = super.remove(key);
        myRemoveCallback(key);
        return ret;
    }
}

Другой (значительно более сложный) вариант — проверить AspectJ, JRE на основе АОП.

person stefan    schedule 25.07.2011
comment
@idungotnosn: посмотрите на шаблон oberserver, базовая реализация доступна в JSE: download.oracle.com/javase/6/docs/api/java/util/Observer.html - person home; 25.07.2011
comment
если в MyTreeMap будет более сложная логика, я думаю, что лучше использовать делегирование вместо подкласса. - person Denis Tulskiy; 25.07.2011