例如:
Security.setProperty("ocsp.enable", "true");
仅在使用CertPathValidator
时使用。我看到了两种重要的选择:
CertPathValidator.setValidatorProperties(..)
(它已经有PKIXParameters
的setter,这是一个好的开始,但它不包括所有内容)有些原因可能是:
public Map getProviderProperties()
,甚至public Object ..
进行投射。我很好奇,因为这些属性并不总是在最明显的地方,而不是在使用API时看到它们,你必须经过几十个谷歌搜索结果(如果幸运的话)得到它们。因为 - 首先 - 你并不总是知道你究竟在寻找什么。
我刚才观察到的另一个致命缺点是这不是线程安全的。例如,如果两个线程想要通过ocsp检查撤销,他们必须设置ocsp.responderURL
属性..并且可能会覆盖彼此的设置。
答案 0 :(得分:2)
这实际上是一个很好的问题,迫使您考虑过去可能做出的设计决策。感谢您提出几年前应该发生的问题!
听起来反对意见并不是这方面的单身方面(尽管可能会发生完全不同的讨论) - 但使用字符串键。
我已经研究过使用这种方案的API,你上面概述的原因肯定是驱动因素 - 它使得解析命令行或属性文件变得非常简单,并且它允许第三方扩展性而无需对官方API的影响。
在我们的库中,我们实际上有一个类,其中包含每个官方参数的一组静态最终String条目。这给了我们两全其美 - 开发人员仍然可以在有意义的情况下使用代码完成。也可以使用内部类来构造相关设置的层次结构。
所有这一切,我认为第一个原因(轻松解析命令行)并没有真正削减它。创建一个反射驱动机制,将设置推送到一堆setter中相当容易,它可以防止String->对象转换的混乱进入主应用程序类。
可扩展性有点棘手,但我认为它仍然可以使用反射驱动系统来处理。我们的想法是让主配置对象(包含所有setter的对象)也有一个registerExtensionConfiguration(xxx)方法。可以使用标准符号(可能是点分隔)来深入到配置对象的结果非循环图中,以确定应该调用setter的位置。
上述方法的优点是它将所有命令行参数/属性文件解析异常处理放在一个地方。错误格式化的论据在被击中之前几周都不存在风险。