2012-02-02 94 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