java – 用于子类化Guava的ImmutableSet的适当方法

前端之家收集整理的这篇文章主要介绍了java – 用于子类化Guava的ImmutableSet的适当方法前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有一个班级
class Receipt
{
     private Set<Order> orders;
     public Receipt(Set<Order> orders)
     {
         this.orders = ImmutableSet.copyOf(orders)
     }   
}@H_403_3@ 
 

这对我很有帮助.

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

class OrderSet extends Set<Order> {}@H_403_3@ 
 

显然我不能扩展Set< Order>,因为它是一个接口.我想将我的实现保持为不可变.但是,我不能扩展ImmutableSet< Order>,因为文档状态:

Note: Although this class is not final,it cannot be subclassed
outside its package as it has no public or protected constructors.
Thus,instances of this type are guaranteed to be immutable.

我可以使用组合,为OrderSet提供ImmutableSet的后备集合,并将所有Set方法委托给它.然而,这似乎有点矫枉过正.

还有另一种方法可以在这里实现非泛型子类吗?

解决方法

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

您应该按如下方式创建OrderSet,因为正如Louis在评论中强调的那样,这个用例正是它们的意思:

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; }
}@H_403_3@ 
 

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

猜你在找的Java相关文章