我想要创建枚举的几个字段,但这些字段有两个值:Valid
和Not valid
:
object MyEnum extends Enumeration
{
val
type1, // this type is valid
type2, // valid
type3, // valid
type4, // Not valid
type5, // Not valid
type6, // Not valid
type7 // Not valid
= value
}
有关如何通过代码区分Valid
和Not valid
的任何建议吗?或者它必须分成2个枚举?
答案 0 :(得分:0)
您可以使用不同的模式,但不会扩展Enumeration但行为类似:
object MyEnum extends Serializable {
abstract sealed class MyEnum(
val ordinal: Int, val isValid: Boolean
) extends Ordered[MyEnum] with Serializable {
def compare(that: MyEnum) = that.ordinal compare this.ordinal
def toInt: Int = this.ordinal
}
case object Type1 extends MyEnum(0, true)
case object Type2 extends MyEnum(1, true)
case object Type3 extends MyEnum(2, true)
case object Type4 extends MyEnum(3, false)
case object Type5 extends MyEnum(4, false)
case object Type6 extends MyEnum(5, false)
case object Type7 extends MyEnum(6, false)
def fromInt(i: Int): MyEnum = values.find(_.ordinal == i).get
val values = Set(
Type1, Type2, Type3, Type4, Type5, Type6, Type7
)
}
通过这种方式,您可以使用类似于上述示例的val myEnum: MyEnum.MyEnum = MyEnum.Type1
进行分配,并且您可以访问myEnum.isValid
。同样,您可以使用fromInt
方法通常访问它。例如MyEnum.fromInt(0).isValid
。如果您提供更多关于您尝试使用这些值的内容,我可以提供更好的解决方案。希望这会有所帮助。
答案 1 :(得分:0)
您可以在Enum对象上创建一个函数,并使用Enumeration.Value的.toString部分
object MyEnum extends Enumeration {
val type1 = Value("valid")
val type2 = Value("valid")
val type3 = Value("valid")
val type4 = Value("Not valid")
val type5 = Value("Not valid")
val type6 = Value("Not valid")
val type7 = Value("Not valid")
lazy val lookup = this.values.map { n => (n, n.toString == "valid") }.toMap
def isValid(myEnum: MyEnum.Value) = lookup.getOrElse(myEnum, false)
}
MyEnum.isValid(MyEnum.type1) //> res0: Boolean = true
MyEnum.isValid(MyEnum.type7) //> res1: Boolean = false
来源: https://github.com/scala/scala/blob/v2.11.7/src/library/scala/Enumeration.scala#L146 http://www.scala-lang.org/api/current/#scala.Enumeration $值