This interesting
post describes how to define an enum in Scala such that the compiler will flag a failure to exhaustively cover all the options. It also provides an implementation of
values, which is often very useful.
However, I found the gist did not function under either Scala 2.8.1 or 2.9.0-1. The compiler would falsely indicate that not all options were covered. Using objects rather than vals resolved the problem.
Arguably this is a clearer representation since Enum values are singletons. It also avoids some of the "boilerplate" nature of the vals implementation, while retaining the compiler checking.
object Foos extends Enum {
sealed trait EnumVal extends Value
object F extends EnumVal { val name = "F" }
object X extends EnumVal { val name = "X" }
}
Unfortunately, this implementation does not populate the
values until each object is explicitly referenced.