2017-07-03 10 views
0

クラスA - >テーブルの行A ClassB - >テーブルの行Bのように、RDMSテーブルの行に対応する一連のデータオブジェクトがあります。 。 。 ClassZ - > TableZの行 私はJDBCを使用してこれらのレコードをフェッチしています。結果セットからオブジェクトを作成しています(結果セットが巨大になることがありますので注意してください)parseClassA()、parseClassB ..parseClassZ()、現在、スイッチ(classType)のようなクラスの型を決定し、対応するクラスのオブジェクトを与える巨大なswitch文を持つ関数を持っています。最適な方法はこれを行うには?タイプに基づいてJavaオブジェクトを作成する

+0

まず、私はおそらくそれを行うには、複数の方法があるので、間違った言葉かもしれない「最適」と言うだろう。それらは異なるトレードオフを持つかもしれないので、 "最適"をよりよく定義する必要があります。次に、それはあなたのコード、要件などにも依存しますが、それを行うには 'Map 'かもしれません。次に、そのマップからパーサを取得しようとします。もしあなたがそれを取得したら、(例えば、 'parse(ResultSet)'のような)メソッドを呼び出します。 – Thomas

+2

あなたが探しているものはここにあると思います。おそらく、公益団体の主題ですか? https://stackoverflow.com/a/6094602/3543153 – DamienB

+0

@Thomas地図をどのように作成しますか?私はデータベースを照会するたびにマップを構築したいのですか? – kumarD

答えて

1

あなたはそれを作成するために、パーサーに作成するためにクラスを関連付けマップ構造使用することができますあなたが必要な場合は

static{ 
    parserByClass = new HashMap<>(); 
    parserByClass.put(MyClass.class, MyParserMyClass::new); 
    parserByClass.put(MyOtherClass.class, MyOtherParserMyClass::new); 
    ... 
} 

:あなたが必要なすべてのマッピングでマップを初期化することができ

Map<Class<?> clazz, Supplier<Parser>> 

を特定のクラスを作成するには、マップを使用してこのクラスのパーサーを取得することができます。

Parser<MyClass> parser = parserByClass.get(MyClass.class).get(); 

あなたはとてもパーサのparse()メソッドを呼び出すことができますのでご注意ください

public interface Parser<T> { 
    T parse(ResultSet resultSet);  
} 

ResultSet resultSet = ...; 
MyClass parse = parser.parse(resultSet); 

は、あなたがparse()メソッドを定義するParserインタフェースを持つべきであると返されたタイプを定義することができるように、理想的にはそれはテストされていないコードです。

2

これはORMと呼ばれています。休止状態は最も広く採用されています。または、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))

関連する問題