我有一組數據對象,它們對應於RDMS表中的行,如ClassA→Table行的行 ClassB→行B的表B 。 。 。我使用JDBC獲取這些記錄並從結果集創建對象(請注意,結果集可能是巨大的)我有每個類的自定義分析器,即parseClassA(),parseClassB().. ..parseClassZ(),目前我有一個巨大的switch語句的函數,它決定了類的類型switch(classType),並給了我對應的類的對象,我想消除這個switch語句,這是最佳的方式來做到這一點?根據其類型創建java對象
0
A
回答
1
你可以使用一個地圖結構類關聯創建解析器來創建它:
Map<Class<?> clazz, Supplier<Parser>>
你可以與所有必需的映射初始化地圖:
static{
parserByClass = new HashMap<>();
parserByClass.put(MyClass.class, MyParserMyClass::new);
parserByClass.put(MyOtherClass.class, MyOtherParserMyClass::new);
...
}
當您需要創建一個特定的類,你可以使用地圖來檢索這個類的解析器:
Parser<MyClass> parser = parserByClass.get(MyClass.class).get();
你可以這樣調用分析器的parse()
方法:
ResultSet resultSet = ...;
MyClass parse = parser.parse(resultSet);
理想情況下,你應該有一個Parser
接口定義parse()
方法,並允許定義返回類型:
public interface Parser<T> {
T parse(ResultSet resultSet);
}
請注意它是一個未經測試的代碼。
2
這叫做ORM - hibernate是最廣泛採用的。或者,您可以選擇DSL。但是,由於我們的主題,我們可能要在這裏有一個功能尋找方法是輪廓:
Stream.of(resultSet).flatMap(r -> someHowMakThisAStream(r))
但是,你查找地圖應該是類型
Map<String,Function<Map<String,Object>,T> lookup...
lookup.put("SomeTable", SomeClass::new);
您將希望每個類都將一個列名稱映射到值(標準化),而不是直接結果集,以便每個實例都不會意外地將結果集轉發太遠。
然後你可以在僞功能,這樣做:stream.of(results).flatMap().map(valMap -> lookup.get(tableName).apply(valMap))
相關問題
- 1. 根據其類型鑄造對象
- 2. 根據類型簽名創建類對象
- 3. 在運行時根據類類型創建Delphi對象
- 4. 根據類型創建不同的對象
- 5. 根據類型標識創建類
- 6. Java:創建一個類型爲類型參數的對象
- 7. 在java中創建超類的類型的子類對象
- 8. 創建目錄根據Java/Android中的類型對圖像進行分類?
- 9. 創建「派生類」類型的對象
- 10. 根據類型返回對象
- 11. 根據輸入創建對象
- 12. 根據數組創建對象
- 13. 根據時區創建NSDate對象
- 14. 根據創建日期列出對象
- 15. 使用泛型類型的Java創建對象
- 16. 如何根據其SHA1代碼識別Git對象類型?
- 17. 的Java:創建類型的對象時,超類
- 18. 創建子類對象是否也創建其超類的對象?
- 19. 根據Android SDK類型轉換java對象級別
- 20. 使用創建其他類的對象
- 21. 創建其他類的對象
- 22. 對象創建JAVA
- 23. 根據其專用類型確定數據對象的表示類?
- 24. Java參數化泛型類型列表創建不同類型的對象
- 25. 根據Java中另一個對象的狀態創建一個對象
- 26. 將對象傳播到子類創建後,根據條件
- 27. 可以根據條件語句創建類的對象嗎?
- 28. 根據文本文件中提供的類名創建對象?
- 29. 是否可以根據用戶的輸入創建類對象?
- 30. 如何根據請求創建多個類對象
首先,我會說「最佳」可能是錯誤的單詞,因爲有可能有多種方式來做到這一點。這些可能有不同的折衷,所以你需要更好地定義「最優」。其次,它也將取決於你的代碼,要求等,但是一個方法可能是'Map'。然後,您只需嘗試將解析器從該映射中移出,如果有一個您調用某個方法(例如'parse(ResultSet)')。 –
Thomas
我認爲你正在尋找的是這裏。也許是一個dublicate主題? https://stackoverflow.com/a/6094602/3543153 – DamienB
@Thomas你會如何構建地圖?每次我查詢數據庫時你想讓我構建地圖嗎? – kumarD