2009-08-27 41 views
1

我有一个应用程序需要一些输入并生成配置文件作为输出。由于确切的输入或输出格式可能随时间而改变,因此我定义了两个接口:导入器和导出器。用于在Java中初始化子类参数的首选方法?

每个具体的进口商或出口商都可能有不同的参数需要初始化才能正常工作。例如,如果导入数据来自CSV文件,您只需要文件的路径,但是如果数据来自数据库,则需要连接字符串,用户名,密码等。出口商也是如此。

我的实现目前是:

public interface Importer { 
    public void setup(Map<String,String> params); 
    public List<ConfigEntry> getList(); 
} 

public interface Exporter { 
    public void setup(Map<String,String> params); 
    public void writeDocument(List<ConfigEntry> entries) throws IOException; 
} 

的设置方法需要的GetList()或writeDocument(之前被称为)可以被调用。我使用Map来保存参数,因为每个子类都可以有不同的参数。

是用JavaBean风格参数初始化的一种首选方式吗?这意味着,将setConnnectionString(),setCSVFilePath(),setX()添加到每个子类。

这些方法的优点和缺点是什么?

+0

如通过@Stephen C和@ ChssPly76时下所提到的,使用依赖注入框架是“首选”的解决方案。 – 2009-08-27 23:40:09

回答

1

有两个明显的缺点,以基于地图的方法:

  1. 缺乏明确定义的参数名称。是的,你可以将它们定义为常量,但你仍然需要检查参数名称是否有效。
  2. 缺少明确定义的参数类型。更糟糕的是,如果我需要传递一个整数,我不得不将它转换为字符串,你必须解析它(并处理可能的错误)。可以通过使用Map<String,Object>和自动边界来稍微缓解,但是您仍然需要验证适当的类型。

基于Setter的方法只有一个缺点 - 它不能完成。也就是说,它无法通过制定者能够可靠地完成ALONE - 你需要某种init()afterPropertiesSet()方法,将所有setter方法之后被调用,将允许您执行额外的(互相依赖)的验证,以补充它和初始化步骤。

此外,这样的事情实际上乞求某种Dependency Injection框架。例如,像Spring一样。

0

我不会说,传递一个地图(或属性)对象在构造函数中必然优先于子类具体的制定者,反之亦然。哪种方法最好取决于你如何去实例化类。

如果你要直接从Java实例类,则映射方法往往是整洁,特别是如果你有组装地图的好方法。 (例如,从一个属性文件中加载一个Properties对象)。'setters'方法迫使你针对每个子类API编写代码。另一方面,如果你打算使用一些支持“布线”,“控制反转”或类似的容器框架(例如Spring,PicoContainer,JavaBeans等)来实例化类,那么通常设置器更好。框架通常负责何时以及如何实例化类并调用setter,使用底层的反射来完成工作。

所以答案是...这取决于...