Case objects vs Enumerations in Scala

前端 未结 14 1206
误落风尘
误落风尘 2020-11-22 16:45

Are there any best-practice guidelines on when to use case classes (or case objects) vs extending Enumeration in Scala?

They seem to offer some of the same benefits.

14条回答
  •  盖世英雄少女心
    2020-11-22 17:31

    I prefer case objects (it's a matter of personal preference). To cope with the problems inherent to that approach (parse string and iterate over all elements), I've added a few lines that are not perfect, but are effective.

    I'm pasting you the code here expecting it could be useful, and also that others could improve it.

    /**
     * Enum for Genre. It contains the type, objects, elements set and parse method.
     *
     * This approach supports:
     *
     * - Pattern matching
     * - Parse from name
     * - Get all elements
     */
    object Genre {
      sealed trait Genre
    
      case object MALE extends Genre
      case object FEMALE extends Genre
    
      val elements = Set (MALE, FEMALE) // You have to take care this set matches all objects
    
      def apply (code: String) =
        if (MALE.toString == code) MALE
        else if (FEMALE.toString == code) FEMALE
        else throw new IllegalArgumentException
    }
    
    /**
     * Enum usage (and tests).
     */
    object GenreTest extends App {
      import Genre._
    
      val m1 = MALE
      val m2 = Genre ("MALE")
    
      assert (m1 == m2)
      assert (m1.toString == "MALE")
    
      val f1 = FEMALE
      val f2 = Genre ("FEMALE")
    
      assert (f1 == f2)
      assert (f1.toString == "FEMALE")
    
      try {
        Genre (null)
        assert (false)
      }
      catch {
        case e: IllegalArgumentException => assert (true)
      }
    
      try {
        Genre ("male")
        assert (false)
      }
      catch {
        case e: IllegalArgumentException => assert (true)
      }
    
      Genre.elements.foreach { println }
    }
    

提交回复
热议问题