我有现有的代码库,有时使用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接口的重写类,然后使用它.无论哪种方式,我都在寻找一个需要最少干预的优秀解决方案,而且不需要使用任何第三方软件包......
我会使用所谓的装饰器模式来包装您的列表。
这是一个简单的示例代码,仅供您参考:
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)