2017-07-03 189 views
0

我有一組數據對象,它們對應於RDMS表中的行,如ClassA→Table行的行 ClassB→行B的表B 。 。 。我使用JDBC獲取這些記錄並從結果集創建對象(請注意,結果集可能是巨大的)我有每個類的自定義分析器,即parseClassA(),parseClassB().. ..parseClassZ(),目前我有一個巨大的switch語句的函數,它決定了類的類型switch(classType),並給了我對應的類的對象,我想消除這個switch語句,這是最佳的方式來做到這一點?根據其類型創建java對象

+0

首先,我會說「最佳」可能是錯誤的單詞,因爲有可能有多種方式來做到這一點。這些可能有不同的折衷,所以你需要更好地定義「最優」。其次,它也將取決於你的代碼,要求等,但是一個方法可能是'Map '。然後,您只需嘗試將解析器從該映射中移出,如果有一個您調用某個方法(例如'parse(ResultSet)')。 – Thomas

+2

我認爲你正在尋找的是這裏。也許是一個dublicate主題? https://stackoverflow.com/a/6094602/3543153 – DamienB

+0

@Thomas你會如何構建地圖?每次我查詢數據庫時你想讓我構建地圖嗎? – kumarD

回答

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))