【发布时间】:2013-12-05 22:40:02
【问题描述】:
我的工作场所一直在尝试从 Java 迁移到 Scala 来完成某些任务,并且它非常适合我们正在做的事情。但是,一些预先存在的日志记录方法需要 java.lang.Enum。记录方法在 (Java) 基类中定义,子类可以定义自己的枚举,记录器将跟踪多个线程/机器中的所有实例。
在 Java 中是这样工作的:
public class JavaSubClass extends JavaBaseClass {
enum Counters {
BAD_THING,
GOOD_THING
}
public void someDistributedTask() {
// some work here
if(terribleThing) {
loggingMethod(Counters.BAD_THING)
} else {
loggingMethod(Counters.GOOD_THING)
// more work here
}
}
}
然后,当任务完成后,我们可以看到
BAD_THING: 230
GOOD_THING: 10345
有没有办法在 Scala 中复制这一点,无论是通过创建 Java Enums 还是从 Enumeration 转换为 Enum?我曾尝试直接扩展Enum,但它似乎已被密封,因为我在控制台中收到错误:
error: constructor Enum in class Enum cannot be accessed in object $iw
Access to protected constructor Enum not permitted because
enclosing object $iw is not a subclass of
class Enum in package lang where target is defined
【问题讨论】:
-
即使您正在迁移到 scala,您仍然可以编写 java 枚举并从您的 scala 代码中使用它们。恕我直言,Scala 并不容易创建枚举;一个密封的特征和一组对象要简单得多,我相信这是首选。
-
在对 Scala 中围绕“枚举”的所有选项进行了广泛研究之后,我在另一个 StackOverflow 线程上发布了对该领域的更完整概述。它包括对“密封特征+案例对象”模式的解决方案,我已经解决了 JVM 类/对象初始化排序问题:stackoverflow.com/a/25923651/501113