这两个片段之间有什么区别
object Main extends Enumeration {
val first : String = "Thriller"
val second : String = "Horror"
val third : String = "Comedy"
val fourth : String = "Romance"
// Main Method
def main(args: Array[String]) {
println(s" Movie Genres = ${Main.first}")
}
}
和
object Main extends Enumeration
{
type Main = Value
// Assigning values
val first = Value("Thriller")
val second = Value("Horror")
val third = Value("Comedy")
val fourth = Value("Romance")
// Main method
def main(args: Array[String])
{
println(s"Main Movie Genres = ${Main.values}")
}
}
在第二段代码中使用type Main = Value
有什么好处?即使在网上读了很多书,我也很难理解这一点。如果可能的话,请分享一些简单的理解。
因为在Java中,当我们在下面的代码中定义这个时,所有的值(HEARTS、DIAMOND等(都是CardSuit类型的,所以我们不能说(第一、第二等(是Main
类型的吗?
enum CardSuit{
HEARTS,
DIAMONDS,
CLUBS,
SPADES,
}
最后一个问题是,有没有办法让2个以上的属性分配给scala中的任何枚举常量?例如val first = Value("Thriller", "movie, "london", "production")
枚举使用了私有构造函数和其他技巧:
- 在用
Enumeration
扩展的object
中定义类型Value
- 限制构造函数,以便只能从对象内部调用它们
- 让这些构造函数产生副作用,这样每个新值都会将自己附加到可变列表中(从外部来看是不可变的(
这种方法有几个问题:
- 执行
object MyEnum extends Enumeration
时,枚举将不会定义为MyEnum
类型,而是定义为MyEnum.Value
- 如果要使用
MyEnum
作为枚举的名称,则必须使用类型别名type MyEnum = MyEnum.Value
或type MyEnum = Value
- 然而伴随物的类型仍将是CCD_ 13而不是CCD_。创建
MyEnum.MyEnum
和MyEnum.MyEnum.type
的别名太傻了 - 每个值都属于相同的类型,因此类型级编程选项非常有限
- 您不能自定义
Value
:让它继承您的类型,添加一些字段,存储String以外的内容,而不存储任何内容
第1点。和2。是人们进行类型别名的原因。这5个都是人们转向封闭特征的原因
sealed trait MyEnum extends Product with Serializable
object MyEnum {
case object One extends MyEnum
case object Two extends MyEnum
case object Three extends MyEnum
}
它们在模式匹配、派生方面工作得更好,更容易定制它们(你只需将东西添加到公共特征/公共抽象类中(等等。
在Scala 3中,它被简化为
enum MyEnum:
case One, Two, Three
总而言之,除了遗留代码之外,使用Enumeration
的理由几乎为零。