繁体   English   中英

有效的Java项目16(第2版) - Forwarding类是否仅用于允许重用?

[英]Effective Java item 16 (2nd edition) - Is Forwarding class only used to allow re-use?

我正在通过Effective Java, Item-16 Favor composition over inheritance 我查看了下面的Forwarding class示例。

我想知道有一个ForwardingSet类是什么意思? InstrumentedSet可以很好地实现Set并拥有一个调用所有方法的私有实例。

是否可以促进重用并防止冗余,如果我们最终在将来需要除了基本行为之外还需要做一些类型的InstrumentedSet 它只是面向未来的设计,还是我缺少的其他东西?

// 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);
       }
       ...
    }

是的, ForwardingSet是一个框架。

如果你有写一些Set ,与其他加工对象物S Set小号内部的“香草”的顶部,但提供不同的功能Set ,你最好几次写的共同部分一次不行。

有效Java中的 Joshua Bloch将其称为“组合”,尽管实际实现看起来更像装饰器模式

作为名为ForwardingSet的类, Guava中可以使用实际的实现。

是否可以促进重用并防止冗余,如果我们最终在将来需要除了基本行为之外还需要做一些类型的InstrumentedSet?

是。

它只是面向未来的设计吗?

是。

还是我还缺少其他的东西?

不,你没有遗漏任何东西。

是促进重复使用并防止冗余吗? 是。
它只是面向未来的设计吗? 是。
我还缺少其他东西吗? 没有。

“转发”通常被称为“ 委托 ”。
请参阅: 委派模式的目的是什么?

具有委托实现的Java类的一些示例:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM