2012-02-02 93 views
6

适当的方式我沿着子类番石榴的ImmutableSet

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>,作为文档状态:

注:虽然此类不是终点,它不能被包外部的子类 因为它没有公开或受保护的构造函数。因此,这种类型的实例保证是不可变的。

我可以用成分,给人OrderSetImmutableSet后备收集和委派所有Set方法吧。但是,这看起来过分了。

有没有另一种方法可以在这里实现一个非泛型的子类?

回答

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

在番石榴一成不变的类被设计成你不要扩展它们。你必须使用组合,这是正确的方式。

+0

此外,请记住让您的IDE为您输入委派方法。在eclipse中,Source-Generate Delegated Method – 2012-02-02 14:49:09

+4

这是_Exactly_什么是'ForwardingSet'及其朋友。 – 2012-02-02 15:15:23

+0

此外,@PabloGrisafi,您的评论是错误的。您应该重写'ForwardingSet.delegate()',并且不要覆盖其行为未被更改的任何方法。 – 2012-02-02 19:03:19