1

我对java中的回调方法实现非常感兴趣。我在网上浏览了一些例子,但我仍然没有信心解决这个问题。我的问题是我的程序必须在将项目插入带有回调方法实现的列表时发出消息通知。我该如何解决这个问题请帮忙。

谢谢

4

3 回答 3

2

扩展您使用的列表类(或自己实现 List 接口)。仅使用一种方法定义回调接口,例如 AddListCallback

void itemAdded(Object item)

在列表的构造函数中传递回调接口实现并将其存储在一个字段中。覆盖

void add(int index, E element);

List 接口的方法(如果需要,可能还有更多方法)。callsuper.add(index, element)然后storedCallback.itemAdded(element)调用回调的方法。

更新:您可以使用基于 AOP 的方法参见例如http://www.mkyong.com/spring/spring-aop-examples-advice/并听取 add() 方法调用,但它似乎是更困难的方法。

于 2013-10-22T05:47:19.477 回答
2

您应该考虑创建一个列表装饰器(设计模式),它允许您List通过仅更改现有代码中的一行来通知每个实现。

这是一般的想法:

public interface ListListener<E> {
    void onAdd(List list, E element);
    void onDelete(List list, E element);
    ...
}

public class EventfulList<E> implements List {
    private List<E> decoratedList;
    private ListListener<E> listener;

    public EventfulList(final List targetList) {
        decoratedList = targetList;
    }

    public void setListener(final ListListener<E> listener) {
        this.listener = listener;
    }

    public boolean add(E element) {
        final boolean result = decoratedList.add(element);
        doOnAdd(element);
        return result;
    }

    public void doOnAdd(final E element) {
        if (listener != null) {
            listener.onAdd(this, element);
        }
    }
}

你会像这样使用它:

public class ListEventsDemo {
    public static void main(String[] args) {
        // Assume this is existing code.
        List<String> list1 = new ArrayList<String>();
        List<String> list2 = new LinkedList<String>();

        // This is new code.
        ListListener<String> listener = new ListListener<String>() {
            public void onAdd(List list, E element) {
                System.out.println(String.format("'%s' added to %s.",
                    element.toString(), list.getClass().getName()));
            }

            public void onDelete(List list, E element) {
                System.out.println(String.format("'%s' removed from %s.",
                    element.toString(), list.getClass().getName()));
            }
        }

        list1 = new EventfulList<String>(list1);
        list2 = new EventfulList<String>(list2);
        ((EventfulList) list1).setListener(listener);
        ((EventfulList) list2).setListener(listener);

        // Existing code again.
        list1.add("123");
        list2.add("abc");
    }
}

一开始它可能看起来有点矫枉过正,但它需要对现有代码进行较少的更改,并且您不需要对每个List实现进行子类化来监控它。

于 2013-10-22T08:18:27.597 回答
1

做类似的事情

public class MyList extends ArrayList{
public boolean add(Object o){
    boolean b = super.add(o);
    callBack();
    return b;
}

public static void main(String[] args){
    List myList = new MyList();
    myList.add("abc");
    System.out.println(myList);
}

public void callBack(){
    //Operation to do in callback
    System.out.println("in callback");
}

}

您需要扩展要使用的 List 实现类,然后覆盖 add 方法。

于 2013-10-22T06:03:02.340 回答