我正在定义一系列类,用于从不同来源获取数据(例如,一个类将从数据库获取数据,另一个类将从文件获取数据,等等)
由于数据源差异很大,因此它们的配置没有通用的接口(interface)。
他们都有一个共同的方法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) {
...
}
}
和数据源B:
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 生成了配置实现。然后用户必须将数据源的类型和配置文件的名称传递给数据源工厂才能获取数据源。
最佳答案
创建一个类似DataSourceConfig
的接口(interface)(抽象类)。 DataSourceAConfig
和 DataSourceBConfig
将实现(扩展)它。在 initialize
方法中,您可以将 Object
替换为 DataSourceConfig
。
如果您的数据源如此不同,您也应该更改 IDataSource:
public interface IDataSource<T extends DataSourceConfig> {
public void initialize(T config);
public List<String> getData();
}
DataSourceConfig 将是通用接口(interface),DataSourceB 将实现 IDataSource,如下所示:
public class DataSourceB implements IDataSource<DataSourceBConfig> {
public void initialize(DataSourceBConfig config) {
initializeB(config);
}
// everything else omitted for simplicity
}
关于java - 最佳实践 : family of classes with various type of configuration class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20418740/