为什么有些API(如JCE,JSSE等)通过单例映射提供其可配置属性?

时间:2010-02-17 18:41:22

标签: java oop api-design

例如:

Security.setProperty("ocsp.enable", "true");

仅在使用CertPathValidator时使用。我看到了两种重要的选择:

  • 再次单身,但每个属性都有getter和setter
  • 包含与当前上下文相关的属性的对象: CertPathValidator.setValidatorProperties(..)(它已经有PKIXParameters的setter,这是一个好的开始,但它不包括所有内容)

有些原因可能是:

  • 从命令行设置属性 - 从命令行到上面建议的类中的默认值的简单转换器将是微不足道的
  • 允许不同提供商提供其他自定义属性 - 他们可以使用public Map getProviderProperties(),甚至public Object ..进行投射。

我很好奇,因为这些属性并不总是在最明显的地方,而不是在使用API​​时看到它们,你必须经过几十个谷歌搜索结果(如果幸运的话)得到它们。因为 - 首先 - 你并不总是知道你究竟在寻找什么。

我刚才观察到的另一个致命缺点是这不是线程安全的。例如,如果两个线程想要通过ocsp检查撤销,他们必须设置ocsp.responderURL属性..并且可能会覆盖彼此的设置。

1 个答案:

答案 0 :(得分:2)

这实际上是一个很好的问题,迫使您考虑过去可能做出的设计决策。感谢您提出几年前应该发生的问题!

听起来反对意见并不是这方面的单身方面(尽管可能会发生完全不同的讨论) - 但使用字符串键。

我已经研究过使用这种方案的API,你上面概述的原因肯定是驱动因素 - 它使得解析命令行或属性文件变得非常简单,并且它允许第三方扩展性而无需对官方API的影响。

在我们的库中,我们实际上有一个类,其中包含每个官方参数的一组静态最终String条目。这给了我们两全其美 - 开发人员仍然可以在有意义的情况下使用代码完成。也可以使用内部类来构造相关设置的层次结构。

所有这一切,我认为第一个原因(轻松解析命令行)并没有真正削减它。创建一个反射驱动机制,将设置推送到一堆setter中相当容易,它可以防止String->对象转换的混乱进入主应用程序类。

可扩展性有点棘手,但我认为它仍然可以使用反射驱动系统来处理。我们的想法是让主配置对象(包含所有setter的对象)也有一个registerExtensionConfiguration(xxx)方法。可以使用标准符号(可能是点分隔)来深入到配置对象的结果非循环图中,以确定应该调用setter的位置。

上述方法的优点是它将所有命令行参数/属性文件解析异常处理放在一个地方。错误格式化的论据在被击中之前几周都不存在风险。

相关问题