Java Enums
对于枚举类来说,名称比 - 每个枚举值表示一个单数计数器更好。Counter
Counters
当javac编译一个类时,它:enum
- 编译为包含枚举的所有构造函数,方法,其他成员(如果有)的普通java类(例如)
Counter
-
每个值 (, ) 都成为 (1) 的字段 - 类等于 (1) () 中的类:enum
GOOD_THING
BAD_THING
public static
Counter
// Java Code:
class Counter {
public static Counter GOOD_THING;
public static Counter BAD_THING;
// constructors, methods, fields as defined in the enum ...
}
类中的初始化逻辑自动将每个值构造为单例对象enum
Scala Options
A. 引用来自 Scala 的 Java Enum
导入计数器,参考GOOD_THING和BAD_THING就像在java中一样,并且(如果您愿意)另外调用Enum类方法:
// Scala Code:
import JavaSubClass.Counter;
def someDistributedTask = {
// some work here
if (terribleThing) {
loggingMethod(Counter.BAD_THING)
} else {
loggingMethod(Counter.GOOD_THING)
// more work here
}
}
// Other things you can do:
val GoodThing = Counter.valueOf("GOOD_THING")
Counter.values() foreach { // do something }
counter match {
case Counter.GOOD_THING => "Hoorah"
case Counter.BAD_THING => "Pfft"
case _ => throw new RuntimeException("someone added a new value?")
}
优点:可以做java枚举所做的一切,并支持模式匹配。Disadvanges:因为基本特征不是,所以不会对任何执行模式匹配的代码进行类型检查,以确保涵盖详尽的情况。sealed
B. 使用 Scala 枚举
将java转换为等效的scala:enum
Enumeration
// Scala Code:
object Counter extends Enumeration {
type Counter = Value
val GoodThing = Value("GoodThing")
val BadThing = Value("BadThing")
}
使用它:
// Scala Code:
import someScalaPackage.Counter;
def someDistributedTask = {
// some work here
if (terribleThing) {
loggingMethod(Counter.BadThing)
} else {
loggingMethod(Counter.GoodThing)
// more work here
}
}
// Other things you can do:
val GoodThing = Counter.withName("GoodThing")
val label = Counter.BadThing.toString
Counter.values foreach { // do something }
myCounter match {
case Counter.GOOD_THING => "Bully!"
case Counter.BAD_THING => "Meh"
case _ => throw new RuntimeException("someone added a new value?")
}
优点:Scala的方法和Java一样丰富,而且支持模式匹配。Disadvanges:不能做java所做的一切 - java enum被定义为一个具有任意构造函数,方法和允许的其他成员的类(即enum基型上的完整OO建模)。因为基本特征不是,所以任何进行模式匹配的代码都不会被类型化检查,以确保涵盖详尽的情况。Enumeration
Enum
enum
sealed
C. 使用 Scala 案例类:
可以将 s 直接转换为案例对象(即单例对象,而不是案例类,它不是单例):enum
sealed trait Counter
object Counter {
case object GoodThing extends Counter;
case object BadThing extends Counter;
}
使用它:
// Scala Code:
import someScalaPackage.Counter;
def someDistributedTask = {
// some work here
if (terribleThing) {
loggingMethod(Counter.BadThing)
} else {
loggingMethod(Counter.GoodThing)
// more work here
}
}
// Other things you can do:
// NO!! val GoodThing = Counter.withName("GoodThing")
val label = Counter.BadThing.toString
// NO!! Counter.values foreach { // do something }
myCounter match {
case Counter.GOOD_THING => "Bully!"
case Counter.BAD_THING => "Meh"
case _ => throw new RuntimeException("someone added a new value?")
}
- 与枚举相比的优势:每个值可以具有不同的祖先或不同的 mixin 特征(只要每个值都符合类型计数器)。可以对性状计数器和每个值进行复杂的 OO 建模。然后可以使用每个不同值的所有不同案例对象参数进行任意复杂的模式匹配。通过具有基本特征,任何进行模式匹配的代码都会被类型化检查,以确保涵盖详尽的情况。(对您的要求没有用)。
sealed
- 枚举的缺点:不要“免费”获得枚举方法(即值,withName,应用程序)。可以通过将自定义实现添加到基类计数器来“修复”(有点麻烦,因为它是手动编码...)。