如何记录现有代码的List接口方法

Job*_*ook 8 java

我有现有的代码库,有时使用ArrayList或LinkedList,我需要找到一种方法来记录每次调用添加或删除时跟踪已添加或删除的内容.

确保登录到位的最佳方法是什么?

所以举个例子.

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(123);
Run Code Online (Sandbox Code Playgroud)

LinkedList<Integer> anotherNewList = new LinkedList<Integer>();
anotherNewList.add(333);
Run Code Online (Sandbox Code Playgroud)

不确定我是否可以拦截add方法来实现这一点,或者创建实现java.util.List接口的重写类,然后使用它.无论哪种方式,我都在寻找一个需要最少干预的优秀解决方案,而且不需要使用任何第三方软件包......

JDC*_*JDC 3

我会使用所谓的装饰器模式来包装您的列表。

这是一个简单的示例代码,仅供您参考:

private static class LogDecorator<T> implements Collection<T> {
    private final Collection<T> delegate;

    private LogDecorator(Collection<T> delegate) {this.delegate = delegate;}

    @Override
    public int size() {
      return delegate.size();
    }

    @Override
    public boolean isEmpty() {
      return delegate.isEmpty();
    }

    @Override
    public boolean contains(Object o) {
      return delegate.contains(o);
    }

    @Override
    public Iterator<T> iterator() {
      return delegate.iterator();
    }

    @Override
    public Object[] toArray() {
      return delegate.toArray();
    }

    @Override
    public <T1> T1[] toArray(T1[] a) {
      return delegate.toArray(a);
    }

    @Override
    public boolean add(T t) {
      // ADD YOUR INTERCEPTING CODE HERE

      return delegate.add(t);
    }

    @Override
    public boolean remove(Object o) {
      return delegate.remove(o);
    }

    @Override
    public boolean containsAll(Collection<?> c) {
      return delegate.containsAll(c);
    }

    @Override
    public boolean addAll(Collection<? extends T> c) {
      return delegate.addAll(c);
    }

    @Override
    public boolean removeAll(Collection<?> c) {
      return delegate.removeAll(c);
    }

    @Override
    public boolean retainAll(Collection<?> c) {
      return delegate.retainAll(c);
    }

    @Override
    public void clear() {
      delegate.clear();
    }
  }
Run Code Online (Sandbox Code Playgroud)