如何在Java中使用带有值的枚举
当我尝试使用enum存储:“=”、“>”、“时,我喜欢在这些情况下使用如何在Java中使用带有值的枚举,java,enums,Java,Enums,当我尝试使用enum存储:“=”、“>”、“时,我喜欢在这些情况下使用 package mypackage; public enum DataValueModifier { //your enum code } 然后 import static mypackage.DataValueModifier.*; public MyClass { // code blah blah blah public void doIt() { // more code blah
package mypackage;
public enum DataValueModifier
{
//your enum code
}
然后
import static mypackage.DataValueModifier.*;
public MyClass
{
// code blah blah blah
public void doIt()
{
// more code blah blah
if (dataValue.contains(EQUAL.getValue()))
{
//...
}
}
}
更好一点。如果您在枚举中定义了一个方法
boolean containedIn(String str)
,并导入了感兴趣的枚举值(在本例中等于),用法如下所示:
if (EQUAL.containedIn(dataValue)) {
...
}
首先,我将通过定义isModifier方法将“contains”方法(或其等效方法)移动到枚举本身
public static enum DataValueModifier {
...
public boolean isModifier( String modifierString )
{
return modifierString != null && value.equals(modifierString);
}
}
然后,您的代码看起来像这样:
if (DataValueModifier.EQUAL.isModifier(dataValue))
{
//...
}
但是,更重要的是,为什么您首先要使用dataValue而不是enum?如果您要获取命令行输入或其他信息,或者解析字符串表达式,然后需要找出表达式,我想我理解。但是如果您可以控制代码,那么您应该从enum开始,您可以说
if ( dataValueEnum == DataValueModifier.EQUAL ) {
{
//...
}
我也会考虑将一个静态方法添加到枚举中,它将给定的字符串转换为正确的枚举值。可能不是很有效,但是除非你真的关心效率,否则会使代码变得更干净。因此,将此方法添加到EnUM:
public static DataValueModifier toDataValueModifier( String dataValue ) {
if( EQUAL.isModifier( dataValue ) {
return EQUAL;
} else if( GREATER_THAN.isModifier( dataValue ) {
return GREATER_THAN;
} else if...
// Do this for all possible values
} else {
return UNKNOWN;
// Also, add an UNKNOWN to your list of enum values.
}
}
isModifier
和toDataValueModifier
方法可能会在DataValueModifier枚举中添加一些难看的代码,但所有其他代码看起来都很棒。您现在可以执行以下操作:
DataValueModifier dataValueEnum = DataValueModifier.toDataValueModifier(dataValue);
if (dataValueEnum == DataValueModifier.EQUAL) {
...
}
甚至
switch( DataValueModifier.toDataValueModifier(dataValue) ) {
case EQUAL:
// ...
break;
case GREATER_THAN:
// ...
break;
case GREATER_EQUAL:
// ...
break;
// ... define all the cases you want
case UNKNOWN:
default:
// ...
}
您应该像比较
DataValueModifier.EQUAL.getValue().equals(dataValue)
那样比较它,而枚举在一周中的几天(Day.MONDAY、Day.周二和on)比较好在我看来,做一个开关比较是可以的-我会像Paul在下面说的那样设置它,但除此之外,它是清楚的,看起来并不那么愚蠢…我假设dataValue是一个字符串?如果是这样,你应该能够覆盖DataValueModifier.toString()
,只需这样做:dataValue.contains(DataValueModifier.EQUAL)
如果您也像Paul建议的那样进行静态导入,它将变成dataValue.contains(EQUAL)
如果您的枚举位于另一个类中,那么它是隐式静态的,请参阅。感谢大家的精彩回答,所有这些都非常有用,我选择Jeff的,因为它是一个完整的答案。您必须使用枚举名称。在本例中,我正在解析字符串,但isModifier方法没有检查代码中的“contains”
DataValueModifier dataValueEnum = DataValueModifier.toDataValueModifier(dataValue);
if (dataValueEnum == DataValueModifier.EQUAL) {
...
}
switch( DataValueModifier.toDataValueModifier(dataValue) ) {
case EQUAL:
// ...
break;
case GREATER_THAN:
// ...
break;
case GREATER_EQUAL:
// ...
break;
// ... define all the cases you want
case UNKNOWN:
default:
// ...
}