【问题标题】:How to init class with unknown number of String params?如何用未知数量的字符串参数初始化类?
【发布时间】:2011-01-14 19:22:05
【问题描述】:

我正在开发 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:

相同的变体,但参数不是传递给工厂方法,而是传递给服务实例(例如在它的 init() 方法中)。

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

缺点:方式比较复杂,利润值得商榷。

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

【问题讨论】:

    标签: java oop api-design


    【解决方案1】:

    你可以有两种工厂方法,一种是你传递一个包含参数的Map,另一种是不带参数的:

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2020-11-24
        • 2012-07-09
        • 1970-01-01
        • 2019-06-08
        • 2021-05-10
        • 2011-05-15
        • 2017-06-14
        • 2011-01-17
        • 2019-01-03
        相关资源
        最近更新 更多