我有一个类
的课程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
方法委托给它。然而,这似乎有点过分了。
我可以通过另一种方式在这里实现非泛型子类吗?
答案 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中的不可变类是为了不扩展它们而设计的。你必须使用合成,这才是正确的方法。