如何使用未知数量的String参数初始化类?

时间:2010-02-09 12:57:10

标签: java oop api-design

我正在开发API,它可以提供对基于Web服务的远程资源的简单访问。

其中一些远程资源需要在交互之前传递特殊参数。例如,其中一个需要传递一对开发人员的密钥,另一个需要一对密钥和唯一标识符。第三个根本不需要这些参数。我现在正在使用3项服务,但它们的数量可以扩大。

对于每个网络服务,我都有相应的API实现。问题是我不知道如何引入我的API可能传递未知数量的具有未知含义的字符串。

我的一些建议:

1

ServiceFactory.createService (ServiceEnum type, Properties keys);

2

ServiceFactory.createService (ServiceEnum type, ServiceParams params);

ServiceParams是标记接口。在这种情况下,我会有一些这样的帮助类:

public class ServiceHelper {

   public static ServiceParams createFirstServiceParams (String secretKey, String publicKey);

   public static ServiceParams createSecondServiceParams (String secretKey, String publicKey, String uid);

   public static ServiceParams createThirdServiceParams ();
} 

优点:每项服务的有意义的参数名称。

缺点:如果我提供对第四个服务的支持,那么用户将不得不更新工厂模块。在第一种情况下,用户只需下载新模块。

3

ServiceFactory.createService (ServiceEnum type, String ... params);

优点:最容易使用。用户不需要执行任何其他操作(如创建ServiceParams的属性)。

缺点:最不明显的方式。用户应该知道哪组参数对应于他想要创建的服务。

4-6:

相同的变体但params不是传递给工厂方法而是传递给Service实例(例如在其init()方法中)。

优点:用户可以根据需要更改服务密钥,而无需创建相同服务的新实例。

缺点:更复杂的方式,利润是值得怀疑的。

您更喜欢哪种变体?为什么?欢迎您的变种。

2 个答案:

答案 0 :(得分:3)

您可以有两个工厂方法,一个用于传递包含参数的Map,另一个用于不带参数:

ServiceFactory.createService(ServiceEnum type);
ServiceFactory.createService(ServiceEnum type, Map<String,?> params);

在这种情况下,调用者有责任正确获取参数,但它为您提供了最大的灵活性。

答案 1 :(得分:1)

我可能会使用选项1并将Properties替换为Map,这是Properties用于其底层实现的内容。