2015-06-03 25 views
2

Scala枚举类型的命名约定是什么?例如,在下面的代码:有关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#等其他语言中的枚举定义相比也很奇怪。

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

在此先感谢。

+0

你可能已经意识到这一点,但很多斯卡拉程序员避免枚举类,而使用密封基本类型和可能值的大小写对象。如果你有兴趣,你可以阅读更多在这个问题的答案:http://stackoverflow.com/questions/1321745/how-to-model-type-safe-enum-types – johanandren

+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 
+0

感谢您的回复。然而,这在某种程度上是棘手的....“导入”不解决可读性问题:有EventType.Registered和EventType.Started,这使得其他人认为“EventType”本身是“枚举”类型,但在Scala世界中, “EventType.EventType”实际上是真正的类型。 –