我正在使用一些Java类,如javax.Mail.Session
和MessageDigest
来构建我正在构建的工具。
我注意到很难为它们分配属性,因为它们使用String
常量。
例如,对于Session
对象,您必须在String
实例中分配Property
个键值对,然后将其用于创建Session
。因此,如果您希望会话记录调试消息,请在"smtp.mail.debug"
实例中分配"true"
,Property
。同样,如果您希望MessageDigest
使用SHA
,请将MessageDigest
实例创建为MessageDigest.getInstance("SHA")
如果我想要使用MessageDigest
/ MD5
等来实现RC4
,或者在我的{添加其他属性},我还要弄清楚要做什么以及从何处获取信息{1}}对象。
如果公共枚举被这些各自的类公开以分配属性,这不是更好吗?
至少可以为程序员节省大量的搜索时间。
答案 0 :(得分:7)
我可以看到两个主要原因:
向后兼容性
在Java 1.5中引入enum
之前,您提供的两个示例已经是API的一部分。还有更多像那样的案例。
<强>扩展强>
请查看示例MessageDigest
。 javadoc指定:
需要Java平台的每个实现来支持 遵循标准的MessageDigest算法:
•MD5
•SHA-1
•SHA-256
这使得其他java.security.Provider
库为其他算法提供MessageDigest
实现,而不是API最低要求的算法。仅列出API级别的限制性enum
中的默认值将限制可扩展性。
在邮件会话属性的情况下,允许其他javax.mail.Provider
实现支持其他/自定义属性也是如此。
答案 1 :(得分:2)
这可能是由于Java主要关注的是提供以前版本的向后兼容性。
enum
是在Java 1.5中引入的,因此针对1.4或更早版本编写的任何API都不会为此功能提供支持。这在JDK
您还需要记住,enum
不可扩展,这意味着如果您想在消息摘要中引入新算法,例如,您将被卡住......那就是“不”你可以这样做的方式。
邮件API也是如此,邮件API提供了对不同概念的支持,并非所有概念都具有相同的属性系列,并且不可能设计出能够支持所有各种属性的单个枚举。现在或将来存在的不同实现,enum
只是为了这项工作而不灵活。
答案 2 :(得分:1)
简单地认为理由只是向后兼容。
对于 JavaMail ,因为它有太多与不同连接器相关的不同设置,您只需要其中一部分与其中一个支持的协议建立连接。每个连接器都是在单独的类中实现的,我认为没有理由让POP3连接器知道IMAP连接器的设置。
对于 MessageDigest ,原因是支持非标准加密算法,该算法未使用JDK打包,而是由第三方JCE适配器提供。 例如,它将如何查找CryptoPro JCE提供的GOST算法:
MessageDigest digest = MessageDigest.getInstance("GOST3411");