我想提出這樣一個場景,這將是不錯的:擴展泛型類並實現其接口的第二次
- 有一個通用的接口,
- 有不同的通用基礎類實現它,
- 爲泛型基類提供子類,
- 以某種方式獲得子類的非泛型接口。
困惑?請閱讀並告訴我您對解決方案的看法。
比方說,我想要一個服務提供基於任何類型的鑰匙 和任何地方(DB,文件等)的任何類型的對象。
對於一個良好的開端讓我們創建一個合適的接口:
public interface ObjectProvider<K, V> {
V provide(K key);
}
這樣我就能提供任何種類的實現。 我想從數據庫和文件提供對象。
讓我們假設提供基於K的V可以使用相同的 數據庫邏輯完成,而不管對象類型如何。所以,我可以寫一個通用的基類 爲DB訪問:
public class DBObjectProvider<K, V> implements ObjectProvider<K, V> {
public V provide(K key) {
V v = null;
//some common DB logic to get V based on K
return v;
}
}
其實,從文件中獲取的對象也是對象類型獨立:
public class FileObjectProvider<K, V> implements ObjectProvider<K, V> {
public V provide(K key) {
V v = null;
//some common file reading logic to get V based on K
return v;
}
}
好了,現在我有兩個通用類,我可能會用它來得到我想要的任何東西。
現在,我想使用這些泛型實現之一來獲取基於數據庫中的String鍵的String對象。另外,我想將它定義爲使用Spring XML的bean。 我想在Spring XML中沒有辦法定義泛型bean(對嗎?),所以我 將創建一個適當的類。所有我需要做的是:
public class DBStringStringProvider extends DBObjectProvider<String, String> {
}
現在我可以這個bean注入到任何:
private ObjectProvider<String, String> objectProvider;
一切都很好,現在的關鍵組成部分。 我可以在很多方面使用我的有用數據庫字符串字符串提供程序(hhmmm ...確定不是真的)。假設我想要製作一個Web服務。 假設我想將DBStringStringProvider作爲CXF Web服務公開並測試它。 的問題是,這樣的Web服務客戶端的代碼如下所示:
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(<INTERFACE>.class);
<INTERFACE> client = (<INTERFACE>) factory.create();
,所以我需要一個非通用接口DBStringStringProvider我沒有因爲它擴展了通用基礎類。
我可以做到以下幾點:
延長ObjectProvider <字符串,字符串>接口與另一個問題:
@WebService
public interface StringStringProvider extends ObjectProvider<String, String> {
@WebMethod
String provide(String key);
}
而且實現它在那裏排序已經由通用基類實現:
public class DBStringStringProvider extends DBObjectProvider<String, String>
implements StringStringProvider {
}
我感覺有點不滿意實施相同的界面,它是已經由基類引入。 但這種方式我能夠利用WS客戶端:
factory.setServiceClass(StringStringProvider.class);
StringStringProvider client = (StringStringProvider) factory.create();
我的問題是:這是一個很好的做法,做什麼,我只是做了?如果沒有,有沒有其他辦法?
這只是一種情況,如果對於已定義爲通用的東西 有一個非通用接口將是非常好的。
我總是設想繼承這種代碼的可憐傢伙。 –
它有什麼問題? – Dzik
@Dzik:回答你的問題:太複雜了...保持簡單,問問自己這樣的設計的優點真的是什麼(保持可維護性)。 – home