The*_*boy 13 java postgresql hibernate
这可能最初似乎是通用的,但事实上,我实际上是在做出我需要使用的决定.
我目前正在进行的工作涉及就业申请,其中需要在某些时候标记为活动或非活动.提交申请时,默认为" 有效".出于某些原因,稍后可能会将其设置为" 非活动".它只能是其中之一,永远不会为null(如果这改变了什么).
我在Java + Hibernate + PostgresSQL中使用它,以防这也有所不同.我的第一直觉是使用布尔值作为我的解决方案,以便它真正作为一个标志,但我有同事建议使用枚举或整数作为更多的状态而不是标志.
我已经使用所有上述解决方案解决了诸如此类的问题,并且它们对彼此都显得有些透明.
有没有一种方法可以更好地适应这种情况?
Col*_*inD 13
即使忽略了将来添加更多状态类型的可能性(这当然是一个很好的论据enum),我认为enum绝对是正确的方法.您没有建模布尔条件,您正在建模应用程序的状态.想一想:应用程序的状态不是真或假,它是活动的还是非活动的!状态enum将以最自然的方式表示.
使用枚举还可以获得许多内置优势,例如将每个状态的文本描述直接绑定到它,因此您不必执行类似的操作
String text = application.isActive() ? "Active" : "Inactive";
Run Code Online (Sandbox Code Playgroud)
你可以这样做
String text = application.getStatus().toString();
Run Code Online (Sandbox Code Playgroud)
此外,您可以使用每个枚举实现不同的抽象方法将特定行为直接绑定到每个状态,将特定数据与每个状态相关联等.
您也可以轻松地允许isActive基于状态的布尔检查...如果您只是存储一个,则不能轻易地做到这一点boolean.
public boolean isActive() {
return status == Status.ACTIVE;
}
Run Code Online (Sandbox Code Playgroud)
并且null不应该是有效状态的事实是无关紧要的......只要确保存储状态(例如,您的EmploymentApplication类或其他)的NullPointerException任何类都抛出一个,如果有人试图null在其上设置状态.
Buh*_*ndi 10
这完全取决于您的要求/规格.如果您只想将状态记录为活动或非活动状态,最好的方法是使用boolean.
但如果在将来,您将拥有如下状态:
Enums非常适合您.在你的情况下,现在,布尔值就足够了.不要过早地尝试过度复杂化,否则您将失去对系统设计和开发的关注.
根据我为企业构建自定义应用程序的经验,诸如“女性/男性”或“开/关”之类的明显二元性几乎总是会演变或演变为多个值。
业务规则通常在早期并不完全了解,或者随着时间的推移而变化。
像我的许多同事一样,我学会了从不将此类值定义为布尔值的艰难方法。稍后从布尔值更改为多个值非常昂贵且有风险。
枚举比布尔值还有其他好处。
EnumJava 中的工具比大多数其他语言中的枚举更加灵活、强大和有用。请参阅Oracle 教程。
在您的枚举定义中,您可以容纳值的表示形式,以便向用户展示和存储在数据库或文件中。这为程序员提供了一个方便的一站式商店,可以阅读有关此枚举的所有信息以及它在您的应用程序中的使用方式。
这是一个完整的例子。这一类显示了我们在用户界面中使用的值以及我们保留的值。
package com.basilbourque.example;
public enum Status {
ACTIVE( "Active" , "active" ),
INACTIVE( "Inactive" , "inactive" ),
UNKNOWN( "Unknown" , "unknown" );
private String displayName, codeName;
Status ( String displayName , String codeName ) {
this.displayName = displayName;
this.codeName = codeName;
}
public String getDisplayName () { return this.displayName; } // Or even add a `Locale` argument to support localization.
public String getCodeName () { return this.codeName; }
// To find a `Status` enum object matching input retrieved from a database.
static public Status ofCodeName ( String codeName ) {
// Loop each of the enum objects to find a match.
for ( Status s : Status.values() ) {
if ( s.getCodeName().equals( codeName ) ) { return s; }
}
throw new IllegalArgumentException( "No such Status code name as: " + codeName );
}
@Override
public String toString() { return "app-status-" + this.getCodeName() ; }
}
Run Code Online (Sandbox Code Playgroud)
请注意可以返回Status与从数据库中检索到的持久值匹配的对象的静态方法:
Status s = Status.ofCodeName( myResultSet.getString( "code" ) ) ;
Run Code Online (Sandbox Code Playgroud)
在 Java 中,枚举有自己的实现,Set并且Map在使用的内存非常少和执行速度非常快方面都进行了高度优化。
Set< Status > auditApprovedStatuses = EnumSet.of( Status.ACTIVE , Status.INACTIVE ) ;
Set< Status > auditAlertStatuses = EnumSet.of( Status.UNKNOWN ) ;
…
if( auditAlertStatuses.contains( application.getStatus() ) ) {
this.alertAuditor( application ) ;
}
Run Code Online (Sandbox Code Playgroud)
请注意,如果您对应用程序状态的定义发生变化,更新这些集合定义是多么容易。
toString价值虽然布尔值显示为字符串true或false字符串,但在您的枚举中,您可以覆盖toString以生成信息量更大的值,例如app-status-inactive.
这些值在记录、跟踪或调试时可能非常有用。
两者都不能做吗?
enum Status {
ACTIVE(true), INACTIVE(false);
private final boolean value;
Status(boolean value) {
this.value = value;
}
boolean getValue() {
return this.value;
}
}
Run Code Online (Sandbox Code Playgroud)
这难道不是让你两全其美吗?它允许您使用名称为 ACTIVE 和 INACTIVE 的布尔值,而不是 true 和 false?
| 归档时间: |
|
| 查看次数: |
22487 次 |
| 最近记录: |