我有两种方法可以从CSV中提取数据
private Car processCar (String [] row) {
Car c = new Car();
c.setCarId(Integer.parseInt(row[CSVColumns.carid.index]));
....
return c;
}
private Driver processDriver(String[] row) {
Driver d = new Driver(row[CSVColumns.name.index]);
sys.setAge(row[CSVColumns.age.index]);
...
return d;
}
现在,当从数据库中提取数据时,我需要再次做这两种方法,但是要稍作改动
private Car processCar (ResultSet rs) {
Car c = new Car();
c.setCarId(rs.getInt("Id"));
....
return c;
}
private Driver processDriver(ResultSet) {
Driver d = new Driver(rs.getString("Name));
sys.setAge(rs.getString("Age"));
.....
return d;
}
有没有一种方法可以简化此过程,这样我就不必重复自己了?此外,每种方法都包含许多 setter/getter /阻焊剂,因此我不愿复制粘贴内容并进行更改...
最佳答案
抽象数据源并使用通用接口(interface)
这个想法是要有一个通用适配器,它可以将ResultSet
或CSV转换为一致接口(interface)背后的通用对象:
interface CarDataSource {
getCarId();
//...
}
还有两个实现:
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()
。具有两个实现的抽象工厂:
非常相似的方法,创建和抽象工厂:
interface CarFactory {
Car create();
}
有两种实现:
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()
,需要String[]
作为参数。但是,如果您有ResultSet
,只需将列提取到数组中的后续项中,然后首先将其转换为String[]
即可:public String[] toStringArray(ResultSet rs)
也可以从另一个方向进行转换,以便
ResultSet
是基本格式,但是ResultSet
很难单独实现。