我有两种方法可以从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很难单独实现。

09-11 03:23
查看更多