使用和持久保存枚举的最佳做法
我在这里看到过几个关于处理和持久化枚举类值的最佳方法的问题/讨论(例如,持久化适合枚举的数据,如何使用NHibernate持久化枚举),我想问一般的consenus是什么。
特别:
- 代码中应如何处理这些值?
- 它们应该如何持久化到数据库中(作为文本/数字)?
- 不同解决方案的权衡是什么?
注意:我将最初包含在此问题中的解释移到了答案中。
我在这里看到过几个关于处理和持久化枚举类值的最佳方法的问题/讨论(例如,持久化适合枚举的数据,如何使用NHibernate持久化枚举),我想问一般的consenus是什么。
特别:
注意:我将最初包含在此问题中的解释移到了答案中。
我同意你说的大部分话。不过,关于枚举的持久性,我想附加一件事:我不认为在构建时从数据库值生成枚举是可以接受的,但我也认为运行时检查不是一个好的解决方案。我会定义第三种方法:有一个单元测试,它将根据数据库检查枚举的值。这可以防止“随意”的背离,并避免每次运行代码时对照数据库检查枚举的开销。
最初的文章对我来说看起来很好。尽管如此,根据这些评论,似乎一些关于Java枚举的评论可能会澄清一些事情。
根据定义,Java中的枚举类型是一个类,但许多程序员倾向于忘记这一点,因为他们宁愿像在其他一些语言中一样将其与“允许值列表”相关联。不仅如此。
因此,为了避免这些 switch 语句,在 enum 类中放置一些代码和其他方法可能是合理的。几乎永远不需要创建一个单独的“类似枚举的真实类”。
还要考虑文档的要点 - 您是否要在数据库中记录枚举的实际含义?在反映值的源代码中(您的枚举类型)还是在一些外部文档中?我个人更喜欢源代码。
如果由于速度或其他原因,您希望在数据库中将枚举值显示为整数,则该映射也应驻留在 Java 枚举中。默认情况下,您将获得字符串名称映射,我对此感到满意。每个枚举值都有一个关联的序数,但直接将其用作代码和数据库之间的映射不是很亮,因为如果有人对源代码中的值重新排序,则该序号将更改。或者在现有值之间添加其他枚举值。或者删除一些值。
(当然,如果有人更改了源代码中枚举的名称,则默认的字符串映射也会变质,但这不太可能意外发生。如有必要,您可以通过在数据库中放置一些运行时检查和检查约束来更轻松地防止这种情况,正如这里已经建议的那样。)