Skip to content

"Enum" classes are not implemented correctly #185

Description

@jpsacha

Correct use of current "Enum" classes leads to compiler warnings due to incorrect implementation of those "Enum"s. Consider current implementation of class scalafx.geometry.Side:

object Side  extends SFXEnumDelegateCompanion[jfxg.Side, Side] {

  val BOTTOM = new Side(jfxg.Side.BOTTOM)
  val LEFT = new Side(jfxg.Side.LEFT)
  val RIGHT = new Side(jfxg.Side.RIGHT)
  val TOP = new Side(jfxg.Side.TOP)

  protected override def unsortedValues: Array[Side] = Array(TOP, BOTTOM, LEFT, RIGHT)
}

sealed case class Side(override val delegate: jfxg.Side) extends SFXEnumDelegate[jfxg.Side] {
  //...
}

If we match on an object of that class:

    val a: Side = ...

    a match {
      case Side.TOP =>
      case Side.BOTTOM =>
      case Side.RIGHT =>
      case Side.LEFT =>
    }

We will get compilation warning:

Warning:(49, 5) match may not be exhaustive.
It would fail on the following input: Side(_)
    a match {
    ^

This is despite the fact that we matched all possible values.

Correct pattern for implementing an "enum" is to use case objects for values and sealed abstract class like:

object Side extends SFXEnumDelegateCompanion[jfxg.Side, Side] {

  case object BOTTOM extends Side(jfxg.Side.BOTTOM)
  case object LEFT extends Side(jfxg.Side.LEFT)
  case object RIGHT extends Side(jfxg.Side.RIGHT)
  case object TOP extends Side(jfxg.Side.TOP)

  protected override def unsortedValues: Array[Side] = Array(TOP, BOTTOM, LEFT, RIGHT)
}

sealed abstract class Side(override val delegate: jfxg.Side) extends SFXEnumDelegate[jfxg.Side] {
  // ...
}

Now there will be no compilation warnings if we do a full match, and proper warning if we miss a case.

All "enum" in ScalaFX need to be impemented using this pattern.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions