Scala:实现可扩展枚举模式

时间:2014-03-14 13:25:33

标签: scala enums

可扩展的Enum模式相对常见,但据我所知,Scala或Jave Enums都不是可扩展的。目前在Scala中实现可扩展Enum模式的最佳方法是什么?到目前为止,我使用的是对象而不是Scala Enums或Java Enums,我提出了以下内容:

trait TerrHexStd

import pEdit.TerrHexE
import pReal.TerrHexR
object TerrPlain extends TerrHexE with TerrHexR    
object TerrForrest extends TerrHexE with TerrHexR
object TerrHill extends TerrHexE with TerrHexR
object TerrMountain extends TerrHexE with TerrHexR
object TerrDesert extends TerrHexE with TerrHexR
object TerrRiver extends TerrHexE with TerrHexR
object TerrSea extends TerrHexE with TerrHexR

trait TerrHexE extends TerrHexStd //in separate package

object TerrUndef extends TerrHexE

trait TerrHexR extends TerrHexStd // in another separate package   

这太可怕了。但它至少是DRY。

我已编辑了我的代码以澄清问题。

1 个答案:

答案 0 :(得分:1)

通常在为Enum使用scala对象时,我会做类似的事情:

sealed abstract class Color(val name:String)
object Color {
  case object Blue extends Color("blue")
  case object Green extends Color("green")
  //...etc
}

"密封,"你可以在Enums上匹配而不提供默认情况,并且没有得到"匹配不是详尽的"警告。 Sealed可以防止枚举的其他实例位于定义它的文件之外,通常您希望限制枚举所具有的值。你的例子中enum的跨包定义对我来说似乎有点奇怪。

配套对象避免使用您的枚举来污染命名空间。