Java中实现Queue接口无需重写所有方法的方案咨询(涉及默认接口)
Java实现Queue接口避免全量手写方法的解决方案
方案1:继承AbstractQueue抽象类(首选方案)
Java标准库已经提供了AbstractQueue抽象类,它预先实现了Queue接口的绝大多数通用方法,你只需要实现5个核心方法即可完成自定义Queue的开发:
- 队列核心操作:
offer()、poll()、peek() - 集合通用操作:
size()、iterator()
示例代码:
public class CustomQueue<E> extends AbstractQueue<E> { @Override public boolean offer(E e) { // 编写自定义入队逻辑 } @Override public E poll() { // 编写自定义出队逻辑 } @Override public E peek() { // 编写自定义查看队首逻辑 } @Override public Iterator<E> iterator() { // 编写自定义迭代器逻辑 } @Override public int size() { // 返回队列当前元素数量 } }
AbstractQueue已经默认实现了remove()、element()、add()、clear()等Queue接口规定的方法,符合Java的接口规范,不需要额外编写。
方案2:组合现有Queue实现(适用于已有父类无法继承AbstractQueue的场景)
如果你的自定义类已经有了其他父类,无法再继承AbstractQueue,可以用组合+委托的模式,包装一个已有的Queue实现类(比如ArrayDeque、LinkedList),只重写你需要自定义的方法,其余方法全部委托给内部的Queue实例即可。
主流IDE(IDEA、Eclipse等)都支持一键生成所有接口方法的委托代码,不需要手动编写。
示例代码:
public class CustomQueue<E> implements Queue<E> { // 初始化已有Queue实现作为委托对象 private final Queue<E> delegate = new ArrayDeque<>(); // 只重写需要自定义逻辑的方法 @Override public boolean offer(E e) { // 自定义入队前置校验/处理逻辑 return delegate.offer(e); } // 剩余方法全部委托给delegate,可由IDE自动生成 @Override public E poll() { return delegate.poll(); } @Override public E peek() { return delegate.peek(); } @Override public int size() { return delegate.size(); } @Override public Iterator<E> iterator() { return delegate.iterator(); } // ... 其余Queue接口方法同理委托即可 }
补充说明
- AbstractQueue的默认实现依赖你编写的核心方法:比如
remove()方法默认会调用你实现的poll(),如果返回null就抛出NoSuchElementException,完全符合Queue接口的规范,不需要额外处理异常分支。 - 组合模式下如果需要修改多个方法的逻辑,只需要重写对应方法即可,未重写的方法会完全沿用原有Queue实现的逻辑。
内容的提问来源于stack exchange,提问作者curiousengineer
相关产品推荐
相关产品推荐

