适当的方式来继承Guava的ImmutableSet

时间:2012-02-02 11:59:53

标签: java guava

我有一个类

的课程
class Receipt
{
     private Set<Order> orders;
     public Receipt(Set<Order> orders)
     {
         this.orders = ImmutableSet.copyOf(orders)
     }   
}

这对我很有帮助。

然而,由于某些类型擦除&amp;我面临的持久性问题,我现在想介绍一种

形式
class OrderSet extends Set<Order> {}

显然我无法扩展Set<Order>,因为它是一个界面。我想将我的实现保持为不可变。但是,我无法扩展ImmutableSet<Order>,正如文档所述:

  

注意:虽然这个类不是最终的,但它不能被子类化   在它的包装之外,因为它没有公共或受保护的构造函数。   因此,这种类型的实例保证是不可变的。

我可以使用合成,为OrderSet提供ImmutableSet的后备集合,并将所有Set方法委托给它。然而,这似乎有点过分了。

我可以通过另一种方式在这里实现非泛型子类吗?

1 个答案:

答案 0 :(得分:13)

不,构图不是矫枉过正,这正是要走的路。

您应该按照以下方式创建OrderSet,因为正如路易斯在评论中强调的那样,此用例正是他们的意图所在:

public class OrderSet extends ForwardingSet<Order> {
  private final ImmutableSet<Order> orders;
  public class OrderSet (Set<Order> orders) {
    this.orders = ImmutableSet.copyOf(orders);
  }
  protected ImmutableSet<Order> delegate() { return orders; }
}

Guava中的不可变类是为了不扩展它们而设计的。你必须使用合成,这才是正确的方法。