java - 转发类示例

标签 java effective-java

阅读 Effective Java , 我从 Item 16: Favor composition over inheritance 中看到了以下示例。

在下面的 InstrumentedSet 中,书中显示我们可以跟踪元素被插入的次数(通过 InstrumentedSet.addCount 变量)。

为此,我们可以简单地附加到此类对象的 addCount,然后调用 ForwardingSet.add(),它会调用实际的 Set 类的 add() 的实际实现。

// Reusable forwarding class 
public class ForwardingSet<E> implements Set<E> {     
  private final Set<E> s;     
  public ForwardingSet(Set<E> s) { this.s = s; }     
  public void clear()               { s.clear();            }    
  public boolean contains(Object o) { return s.contains(o); }
...
}

// Wrapper class - uses composition in place of inheritance   
public class InstrumentedSet<E> extends ForwardingSet<E> {     
      private int addCount = 0;     
      public InstrumentedSet(Set<E> s) { super(s); } 
      @Override public boolean add(E e) {         
          addCount++;
          return super.add(e);
       }
       ...
    }

我的理解是否正确,要使用此模式/方法,Forwarding* 类必须调用其父类的所有 方法(在本例中设置)?

最佳答案

是的,您是对的,ForwardingSet 委托(delegate)/转发它对支持集的所有调用。

您可能想看看流行库 Guava 中的工作示例:ForwardingMap .

关于java - 转发类示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20151598/

相关文章:

java - 为什么 importStatic Eclipse 模板变量需要命名空间?

ssl - 使用某些 JDK 重置 Java TLS 连接

java - 当实体具有多对多关系时如何使用条件查询?

java - 在 equals 和 hashcode 方法中使用自动生成的 Hibernate 实体对象的 id

java - 向父类(super class)添加新方法和由此产生的问题 - 可能性?

java - 将数字分成相似大小的 block

java - 为什么我看到打开的 JDK 1.8 而不是 Java 8?

JavaBean 缺点——构造时不一致

java - 过多的检查与 future 的可扩展性权衡

java - 一种扩展可实例化类并添加值组件同时保留相等契约的方法