java - 最佳实践 : family of classes with various type of configuration class

标签 java

我正在定义一系列类,用于从不同来源获取数据(例如,一个类将从数据库获取数据,另一个类将从文件获取数据,等等) 由于数据源差异很大,因此它们的配置没有通用的接口(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)(抽象类)。 DataSourceAConfigDataSourceBConfig 将实现(扩展)它。在 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/

相关文章:

java - 递归在应该为真时返回假

java - Android App 蓝牙/LightBlue Bean

java - 错误 : Hash of java. xml (...) 与 java.base 中记录的预期哈希 (...) 不同

Java hibernate如何使用select...where id in()

java - 如何正确创建类 Ratio add(Ratio r)?

java - 带有 Mongodb 源的 Spring 批处理项目读取器 : How to convert DBObject to a custom POJO in the ItemReader?

java - 具有基本算术和符号表达式的 Antlr4 语法

java - 使用 Java EWS 的 Outlook 类别颜色

java - 在命中 '/login' url 之前未检测到用户已登录

java - 为什么 Java 泛型可以转换不可分配的类型(Every Exception 到 RuntimeException)?