2012-06-29 35 views
2

我已經設計了一個使用接口的完整API,客戶可以使用這些接口來實現某些行爲。在內部,我想使用我自己的實現類來使用更豐富的API。我希望這些實現能夠繼續符合基於接口的API,但是Java對泛型的處理正在發揮作用。同時支持基於公共接口的API和內部具體的API嗎?

下面是一個例子:

public interface PublicAPI { 
    void doSomething(SomeType object); 
} 

public class SomeTypeImpl implements SomeType { } 

public class InternalClass implements PublicAPI { 
    public void doSomething(SomeTypeImpl object) { 
     // ... 
    } 
} 

在一些情況下,可以使用公共API來指定使用通配符,如<T extends SomeType>一個類型,但是這打破了與通用集合造成方法衝突。

所以我問你,有沒有什麼方法可以支持這種類型的設計(或更好的設計),還是註定要在我的內部類和公共API的實現之間來回轉換?

謝謝!


UPDATE

我已經得到了爲什麼它是不是真的有可能執行更具體的類型比該API提供了更好的手感。一旦任何人有你的對象的一個​​實例,它可以被'污染'具有較少的特定類型。

根據ACL建議,我採取了在我自己的特定包內使用內部類的方法,然後使用公共API接口爲它們創建「視圖」。一旦創建了視圖,該對象將被標記爲不純,並且不再能保證對象除接口以外的任何類型。在我自己的類中,當不純的對象被處理時我會拋出異常(因爲這意味着引用被允許提前泄漏)。

我會留下問題以進一步分析。

+0

你想在你自己的模型中實現'SomeType'出於這個原因?如果'SomeType'已經來自API,爲什麼不實現呢? –

+1

如何使用某種類型的ACL到您的API方法? – Napolux

回答

1

你爲什麼不生成你的界面?喜歡的東西:

public interface PublicAPI<T extends SomeType> { 
    void doSomething(T object); 
} 

通過,你可以擴展接口方式:

公共接口InternalPublicAPI擴展PublicAPI { ....在這裏補充 您的內部方法}

有這樣的事情在Hibernate中,有SessionSessionImplementor接口。

+0

+1。刪除我的答案,以保持這一個,因爲我更喜歡它:) – GETah

+0

當你添加越來越多的類型會發生什麼?您的類型變量列表將會增長和增長,每個人都必須適應每個API的變化。 – Ben