我有一个班级
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中的不可变类是为了不扩展它们而设计的.你必须使用构图,这才是正确的方法.