有关Scala枚举类型的命名约定?

时间:2015-06-03 03:28:19

标签: scala naming-conventions

Scala枚举类型的命名约定是什么?例如,在下面的代码中:

object EventType extends Enumeration {
    type EventType = Value

    val Registered = Value("Registered")
    val Started = Value("Started")
}

/**
 * The event that fires under specific life cycle
 *
 * @param eventType the [[EventType.EventType]]
 */
 case class Event(eventType: EventType.EventType)

上面的代码遵循Scala doc中描述的相同样式。这里的问题是你可以看到" EventType.EventType"的名称。与Java或C#等其他语言中的枚举定义相比,它是多余的,也很奇怪。

所以我想知道是否有任何推荐的命名方式来提高可读性?

提前致谢。

1 个答案:

答案 0 :(得分:1)

要缩短它,您可以使用带下划线的导入从对象EventType导入所有内容。因此,您可以使用import EventType代替import EventType._。这是一个例子:

scala> object EventType extends Enumeration {
     |     type EventType = Value
     |
     |     val Registered = Value("Registered")
     |     val Started = Value("Started")
     | }
defined object EventType

scala> object Test {
     | import EventType._
     |
     | case class Event(eventType: EventType)
     | }
defined object Test

事情似乎令人困惑,因为EventType是对象的名称,而EventType.EventType是枚举的类型。所以如果你这样使用它:

EventType.Registered

然后在这种情况下,它是对象的名称,而不是类型。相反,这里:

case class Event(eventType: EventType)

它是类型的名称,即用type EventType定义的名称。

如果您想避免混淆,可以为该类型指定一个不同的名称:

scala> object Events extends Enumeration {
     |           type EventType = Value
     |           val Registered = Value("Registered")
     |           val Started = Value("Started")
     | }
defined object Events
scala> object Test {
     | import Events._
     | case class Event(eventType: EventType)
     | val a = Event(Registered)
     | }
defined object Test