最佳实践:具有各种类型的配置类的类系列

时间:2013-12-06 07:48:43

标签: java

我定义了一系列用于从不同来源获取数据的类(例如,一个类将从数据库获取数据,另一个类从文件中获取数据等) 由于数据源非常不同,因此其配置没有通用接口。 尽管如此,它们都有一个共同的方法getData()

我们的想法是定义一组预定义的配置(大多数情况下,使用的配置将仅取决于区域设置,因此有一种配置用于美国,一种用于法国等)。

我创建了界面:

public interface IDataSource {
    public void initialize(Object config);
    public List<String> getData();
}

类DataSourceA:

public class DataSourceA implements IDataSource {
    public void initialize(Object config) {
        DataSourceAConfig configA = (DataSourceAConfig) config;
        initializeA(configA);
    }

    public List<String> getData() {
        ...
    }

    private void initializeA(DataSourceAConfig config) {
        ...
    }
}

和DataSourceB:

public class DataSourceB implements IDataSource {
    public void initialize(Object config) {
        DataSourceBConfig configB = (DataSourceBConfig) config;
        initializeB(configB);
    }

    public List<String> getData() {
        ...
    }

    private void initializeA(DataSourceBConfig config) {
        ...
    }
}

我对该解决方案不满意(例如,使用initialize(Object config),然后转换配置)。我正在寻找有关如何重新思考问题的建议。

编辑: 我使用jaxb生成了配置实现。然后,用户必须将数据源类型和配置文件的名称传递给数据源工厂以获取数据源。

1 个答案:

答案 0 :(得分:1)

创建一个像DataSourceConfig这样的接口(抽象类)。 DataSourceAConfigDataSourceBConfig将实施(扩展)它。在initialize方法中,您可以将Object替换为DataSourceConfig

如果您的数据源如此不同,您也应该更改IDataSource:

public interface IDataSource<T extends DataSourceConfig> {
    public void initialize(T config);
    public List<String> getData();
}

DataSourceConfig将是通用接口,DataSourceB将实现IDataSource,如下所示:

public class DataSourceB implements IDataSource<DataSourceBConfig> {
    public void initialize(DataSourceBConfig config) {
        initializeB(config);
    }
    // everything else omitted for simplicity
}