Scala中的枚举具有多个构造函数参数

时间:2009-12-02 13:35:54

标签: scala enums

我正在编写我的第一个大型Scala程序。在Java等价物中,我有一个枚举,其中包含我的UI控件的标签和工具提示:

public enum ControlText {
  CANCEL_BUTTON("Cancel", "Cancel the changes and dismiss the dialog"),
  OK_BUTTON("OK", "Save the changes and dismiss the dialog"),
  // ...
  ;

  private final String controlText;
  private final String toolTipText;

  ControlText(String controlText, String toolTipText) {
    this.controlText = controlText;
    this.toolTipText = toolTipText;
  }

  public String getControlText() { return controlText; }
  public String getToolTipText() { return toolTipText; }
}

别介意使用枚举的智慧。还有其他地方我想做类似的事情。

如何使用scala.Enumeration在Scala中执行此操作? Enumeration.Value类只接受一个String作为参数。我需要将其子类化吗?

感谢。

3 个答案:

答案 0 :(得分:14)

你可以这样做,以匹配枚举的使用方式:

sealed abstract class ControlTextBase
case class ControlText(controlText: String, toolTipText: String)
object OkButton extends ControlText("OK", "Save changes and dismiss")
object CancelButton extends ControlText("Cancel", "Bail!")

答案 1 :(得分:8)

我想就此问题提出以下解决方法:

object ControlText extends Enumeration {

  type ControlText = ControlTextValue

  case class ControlTextValue(controlText: String, toolTipText: String) extends Val(controlText)

  val CANCEL_BUTTON = ControlTextInternalValue("Cancel", "Cancel the changes and dismiss the dialog")
  val OK_BUTTON = ControlTextInternalValue("OK", "Save the changes and dismiss the dialog")

  protected final def ControlTextInternalValue(controlText: String, toolTipText: String): ControlTextValue = {
    ControlTextValue(controlText, toolTipText)
  }    
}

现在您可以使用ControlText作为Java枚举:

val c: ControlText
c.toolTipText

唯一有点难闻的气味是通过withNameapply方法获取枚举对象。你必须做一个演员:

val c: ControlText = ControlText.withName(name).asInstanceOf[ControlText]

答案 2 :(得分:1)

继Mitch的回答之后,如果您发现密封行为对于将子类化实例限制为定义基类的文件没有足够的限制性,您可以使用这样的对象(模块)定义:

object ControlTexts {
  sealed abstract class ControlTextBase

  case class ControlText private[ControlTexts] (controlText: String, 
                                                toolTipText: String)
          extends ControlTextBase

  object OkButton     extends ControlText("OK", "Save changes and dismiss")
  object CancelButton extends ControlText("Cancel", "Bail!")
}

这显然限制了ControlText实例的进一步实例化。 sealed关键字在帮助检测模式匹配中的缺失案例方面仍然很重要。