Case objects vs Enumerations in Scala

前端 未结 14 1165
误落风尘
误落风尘 2020-11-22 16:45

Are there any best-practice guidelines on when to use case classes (or case objects) vs extending Enumeration in Scala?

They seem to offer some of the same benefits.

14条回答
  •  难免孤独
    2020-11-22 17:34

    I've seen various versions of making a case class mimic an enumeration. Here is my version:

    trait CaseEnumValue {
        def name:String
    }
    
    trait CaseEnum {
        type V <: CaseEnumValue
        def values:List[V]
        def unapply(name:String):Option[String] = {
            if (values.exists(_.name == name)) Some(name) else None
        }
        def unapply(value:V):String = {
            return value.name
        }
        def apply(name:String):Option[V] = {
            values.find(_.name == name)
        }
    }
    

    Which allows you to construct case classes that look like the following:

    abstract class Currency(override name:String) extends CaseEnumValue {
    }
    
    object Currency extends CaseEnum {
        type V = Site
        case object EUR extends Currency("EUR")
        case object GBP extends Currency("GBP")
        var values = List(EUR, GBP)
    }
    

    Maybe someone could come up with a better trick than simply adding a each case class to the list like I did. This was all I could come up with at the time.

提交回复
热议问题