java - 如何为现有代码记录List接口(interface)方法

标签 java

我现有的代码库有时会使用 ArrayList 或 LinkedList,我需要找到一种方法来在调用添加或删除时进行记录,以跟踪已添加或删除的内容。

确保我已登录的最佳方法是什么?

例如。

ArrayList<Integer> list = new ArrayList<Integer>();
list.add(123);

LinkedList<Integer> anotherNewList = new LinkedList<Integer>();
anotherNewList.add(333);

不确定我是否可以拦截 add 方法来实现此目的,或者创建实现 java.util.List 接口(interface)的重写类然后改用它。无论哪种方式,我都在寻找一个好的解决方案,它需要最少的干预并且最好不使用任何第三方包......

最佳答案

我会使用所谓的 Decorator Pattern包装您的列表。

这将是一个简单的示例代码,只是为了给您一个想法:

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();
    }
  }

关于java - 如何为现有代码记录List接口(interface)方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41240104/

相关文章:

java - 使用 Retrofit 处理不一致的 API 响应

java - java中JSON转换结果失败(JSONObject无法转换为JSONArray)

java - 创建 3D 程序的工具

java - 如何确定何时应该在 GUI 线程中进行函数调用

java - Chromedriver 未及时加载。给出错误 org.openqa.selenium.WebDriverException : Timed out waiting for driver server to start

java - onClick 监听器和 onClick on XML 将不起作用

java - 无论java应用程序的类路径指定执行返回: "Error: Could not find or load main class"

java - 如何使 javax.mail 使用本地 "sendmail"二进制文件?

java - yield() 的主要用途是什么,它与 join() 和 interrupt() 有何不同?

java - 如何在尝试处理文件之前验证文件是否已完成写入?