|
|
1
18
我同意你说的很多话。不过,关于枚举的持久性,我想附加一点:我不相信在构建时从db值生成枚举是可以接受的,但我也认为运行时检查不是一个好的解决方案。我将定义第三种方法:进行单元测试,该测试将根据数据库检查枚举的值。这可以防止“偶然”的分歧,并避免每次运行代码时根据数据库检查枚举的开销。 |
|
|
2
12
第一篇文章对我来说很好。尽管如此,基于评论,似乎有一些关于Java枚举的评论可能会澄清一些事情。 Java中的枚举类型是按定义定义的类,但许多程序员往往会忘记这一点,因为它们与一些其他语言中的“允许值列表”相关联。不止这些。 因此,为了避免这些switch语句,可以在枚举类中放置一些代码和其他方法。几乎没有必要创建一个单独的“枚举类真实类”。 还要考虑文档的要点-是否要在数据库中记录枚举的实际含义?在反映值(枚举类型)的源代码中还是在一些外部文档中?我个人更喜欢源代码。 如果您想将EnUM值作为数据库中的整数,由于速度或任何原因,映射也应驻留在Java枚举中。默认情况下,您会得到字符串名称映射,我对此很满意。有一个序数与每个枚举值关联,但直接将其用作代码和数据库之间的映射并不十分明亮,因为如果有人重新排序源代码中的值,该序数将发生更改。或者在现有值之间添加其他枚举值。或者删除一些值。 (当然,如果有人在源代码中更改了枚举的名称,那么默认的字符串映射也会出错,但这不太可能是偶然发生的。如果需要的话,您可以通过在数据库中放置一些运行时检查和检查约束来更容易地防止这种情况发生,正如这里已经建议的那样。) |
|
|
3
6
在C的代码处理中,您忽略了定义delcariting的0值。 我几乎没有失败,总是将我的第一个值声明为:
作为空值。因为支持类型是一个整数,而一个整数默认为0,所以在许多地方,了解枚举是否已被编程设置非常有用。 |
|
|
4
6
我试着总结一下我的理解。如果您有任何更正,请随意编辑此内容。接下来是: 在代码中 在代码中,枚举应该使用语言的原生枚举类型(至少在爪哇和C)中处理,或者使用类似于 "typesafe enum pattern" . 不鼓励使用普通常量(整数或类似的常量),因为您会失去类型安全性(并且很难理解哪些值是合法输入,例如方法)。 这两者之间的选择取决于附加到枚举的附加功能的数量:
特别是,至少在Java中,枚举不能从另一个类继承,所以如果你有几个类似的行为,你想把它们放进一个超类中,你就不能使用Java的枚举。 持久枚举 要持久化枚举,应为每个枚举值分配一个唯一的ID。该ID可以是整数,也可以是短字符串。最好使用短字符串,因为它可以是助记符(使DBA等更容易理解数据库中的原始数据)。
这种方法的一个问题是合法枚举值列表存在于两个位置(代码和数据库)。这很难避免,因此通常被认为是可以接受的,但有两种选择:
|
|
|
5
5
Java或C语言应该总是使用代码中的枚举。免责声明:我的背景是C。 如果要将该值持久化到数据库中,则应显式定义每个枚举成员的整数值,以便以后的代码更改不会意外地更改已翻译的枚举值,从而改变应用程序的行为。 值应始终作为整数值保存到数据库中,以防止枚举名称重构。在wiki中保存每个枚举的文档,并向数据库字段添加一条注释,指向wiki页面记录类型。还将XML文档添加到包含指向wiki条目的链接的枚举类型中,以便通过intellisense使用它。 如果使用工具生成CRUD代码,那么它应该能够定义用于列的枚举类型,以便生成的代码对象始终使用枚举成员。 如果需要为枚举成员应用自定义逻辑,则可以使用以下选项:
我没有尝试过这种方法,但是对于SQL Server 2005或更高版本,理论上您可以在数据库中注册C代码,该数据库将包含枚举信息,并且能够将值转换为用于视图或其他构造的枚举,从而使DBA更容易使用转换数据的方法。 |
|
|
6
3
由于所需的额外空间和较慢的搜索速度,在数据库中存储枚举的文本值不如存储整数。它的价值在于它比数字更有意义,但是数据库是用于存储的,表示层是用于使事物看起来更漂亮。 |
|
|
7
3
根据我的经验,除了将选项(作为标志)传递给即时方法调用之外,使用枚举还可以导致
因此,对于具有更多功能的枚举类实体,您应该花一些时间将其创建为一个类,并记住以下几点:
|
|
|
8
3
每次你发现自己在代码中使用“幻数”时,都会变为枚举。除了节省时间(因为当错误出现时魔法会消失…)它还可以节省你的眼睛和记忆(有意义的枚举使代码更易读和自我记录),因为猜猜看-你很可能是维护和开发你自己代码的人。 |
|
|
9
2
imho,关于代码部分:
你应该
总是
对枚举使用“enum”类型,如果这样做,基本上会得到很多免费的东西:类型安全、封装和避免切换、支持一些集合,如
对于持久性部分,您始终可以持久化枚举的字符串表示形式,并使用enum.valueof(string)方法将其加载回去。 |
|
|
10
1
我知道这是一个旧的论坛,如果数据库中有其他东西可以直接集成到它上面呢?例如,当产生的数据库是代码的唯一目的时。然后,您将在每次集成时定义枚举。最好把它们放在数据库中。否则,我同意原来的帖子。 |
|
|
H.v.M. · 为最后一个枚举值指定不同的变量值 4 年前 |
|
|
JimmyDiJim · 在声明后定义枚举变量 8 年前 |
|
|
Eli K · 语法错误,插入“{”以完成枚举体(在类的末尾) 8 年前 |
|
|
Vivek Shukla · 在中间添加枚举 8 年前 |
|
|
DannyD · 如何访问typescript中的枚举名称 8 年前 |