为什么Java类库仍然使用String常量来代替枚举

时间:2014-08-03 23:56:53

标签: java string session enums constants

我正在使用一些Java类,如javax.Mail.SessionMessageDigest来构建我正在构建的工具。

我注意到很难为它们分配属性,因为它们使用String常量。

例如,对于Session对象,您必须在String实例中分配Property个键值对,然后将其用于创建Session。因此,如果您希望会话记录调试消息,请在"smtp.mail.debug"实例中分配"true"Property。同样,如果您希望MessageDigest使用SHA,请将MessageDigest实例创建为MessageDigest.getInstance("SHA")

如果我想要使用MessageDigest / MD5等来实现RC4,或者在我的{添加其他属性},我还要弄清楚要做什么以及从何处获取信息{1}}对象。

如果公共枚举被这些各自的类公开以分配属性,这不是更好吗?

至少可以为程序员节省大量的搜索时间。

3 个答案:

答案 0 :(得分:7)

我可以看到两个主要原因:

向后兼容性

在Java 1.5中引入enum之前,您提供的两个示例已经是API的一部分。还有更多像那样的案例。

<强>扩展

请查看示例MessageDigestjavadoc指定:

  

需要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

中的许多API中非常常见

您还需要记住,enum不可扩展,这意味着如果您想在消息摘要中引入新算法,例如,您将被卡住......那就是“不”你可以这样做的方式。

邮件API也是如此,邮件API提供了对不同概念的支持,并非所有概念都具有相同的属性系列,并且不可能设计出能够支持所有各种属性的单个枚举。现在或将来存在的不同实现,enum只是为了这项工作而不灵活。

答案 2 :(得分:1)

简单地认为理由只是向后兼容。

对于 JavaMail ,因为它有太多与不同连接器相关的不同设置,您只需要其中一部分与其中一个支持的协议建立连接。每个连接器都是在单独的类中实现的,我认为没有理由让POP3连接器知道IMAP连接器的设置。

对于 MessageDigest ,原因是支持非标准加密算法,该算法未使用JDK打包,而是由第三方JCE适配器提供。 例如,它将如何查找CryptoPro JCE提供的GOST算法:

  MessageDigest digest = MessageDigest.getInstance("GOST3411");