获取Scala枚举实例

时间:2017-03-12 12:44:43

标签: scala enums singleton

我有以下Scala enum,我设计了after reading this answer

object RunMode extends Enumeration {
    val CLIENT_MODE = Value("CLIENT_MODE")
    val SERVER_MODE = Value("SERVER_MODE")
}

我现在正试图将它的一个实例作为参数传递给另一个类的构造函数:

package com.me.myapp.shared.config

import com.me.myapp.shared.utils.RunMode

class MyAppConfig(runMode : RunMode) {

}

这给了我一个编译器错误:

  

无法解析符号RunMode

BTW:com.me.myapp.shared.utils.RunMode RunMode的正确包裹路径,因此

>

假设这可能是因为RunMode对象只有(曾经)一个实例,并且可能阻止它作为arg传入。

无论哪种方式,我都不关心解决方案是什么。但我需要一个" enum"称为RunMode,我需要能够将其实例传递给其他类的构造函数。有什么想法吗?

2 个答案:

答案 0 :(得分:3)

你几乎就在那里,Enumeration的值的正确类型是Enumeration.Value,所以在这里你需要使用:

class MyAppConfig(runMode : RunMode.Value) {

}

答案 1 :(得分:3)

假设唯一存在于RunMode类型的实例是object本身,这是正确的。

然而,解决问题并不是那么困难。

object RunMode extends Enumeration {
  type RunMode = Value
  val CLIENT_MODE = Value("CLIENT_MODE")
  val SERVER_MODE = Value("SERVER_MODE")
}

Enumeration类为您提供类型Value,它是所有枚举类型应具有的类型。它的范围是类实例,因此Enumeration的每个实例都有自己的Value类型。

您可以通过创建类型别名为其指定正确的名称。 然后你可以导入内部类型别名,如下所示:

import com.me.myapp.shared.utils.RunMode._

然后您可以传递Enumeration周围的实例,因此也可以让MyAppConfig与现在保持一致。

或者,您当然也可以省略类型别名,只需将MyAppConfig的类型签名更改为RunMode.Value即可。但是我相信前一种方法在澄清意图方面要好得多。

class MyAppConfig(runMode: RunMode.Value) {

}