加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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

发布时间:2020-12-15 02:47:53 所属栏目:Java 来源:网络整理
导读:我有一个班级 class Receipt{ private SetOrder orders; public Receipt(SetOrder orders) { this.orders = ImmutableSet.copyOf(orders) } } 这对我很有帮助. 然而,由于某些类型擦除我面临的持久性问题,我现在想介绍一种形式 class OrderSet extends SetOrd
我有一个班级
class Receipt
{
     private Set<Order> orders;
     public Receipt(Set<Order> orders)
     {
         this.orders = ImmutableSet.copyOf(orders)
     }   
}

这对我很有帮助.

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

class OrderSet extends Set<Order> {}

显然我不能扩展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; }
}

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读