データ ソースを抽象化し、共通のインターフェイスを使用する
ResultSet
アイデアは、または CSV を一貫したインターフェイスの背後にある共通のものに変換する共通のアダプターを用意することです。
interface CarDataSource {
getCarId();
//...
}
そして2つの実装:
class CsvDataSource implements CarDataSource {
private final String[] row;
public CsvDataSource(String[] row) {
this.row = row;
}
public int getCarId() {
return Integer.parseInt(row[CSVColumns.carid.index]);
}
//...
}
class ResultSetDataSource implements CarDataSource {
private final ResultSet rs;
public ResultSetDataSource(ResultSet rs) {
this.rs = rs;
}
public int getCarId() {
return Integer.parseInt(rs.getString("Name));
}
//...
}
これはあなたがそれを使用する方法です:
private Car processCar(CarDataSource s) {
Car c = new Car();
c.setCarId(s.getCarId());
....
return c;
}
new CsvDataSource()
または のいずれかを提供しますnew ResultSetDataSource()
。
2 つの実装を持つ抽象ファクトリ:
非常によく似たアプローチで、ファクトリを作成して抽象化します。
interface CarFactory {
Car create();
}
2 つの実装:
class CsvCarFactory implements CarFactory {
private final String[] row;
public CsvDataSource(String[] row) {
this.row = row;
}
public Car create() {
Car c = new Car();
c.setCarId(Integer.parseInt(row[CSVColumns.carid.index]));
//...
return c;
}
}
class ResultSetCarFactory implements CarDataSource {
private final ResultSet rs;
public ResultSetCarFactory(ResultSet rs) {
this.rs = rs;
}
public Car create() {
Car c = new Car();
c.setCarId(rs.getInt("Id"));
//...
return c;
}
//...
}
組み合わせ
上記のアプローチはどれも好きではありません。なぜなら、それらは多くの価値を追加せずに多くのボイラープレートを導入するからです。しかし、最初のアプローチは、それを減らすと有望です。
引数としてprocessCar()
取るものを 1 つだけ用意してください。String[]
ただし、 がある場合は、列を配列内の後続の項目に抽出することによりResultSet
、最初に変換するだけです。String[]
public String[] toStringArray(ResultSet rs)
ResultSet
基本フォーマットである逆方向への変換も可能ですが、ResultSet
単独で実装するのははるかに困難です。