Подтвердить что ты не робот

Как создать перечисление в scala, которое имеет дополнительное поле

В Java у меня есть что-то вроде этого

public enum FlatFileHeaderMapping {

   HEADER_EL(1),
   HEADER_RESERVED1(5),
   HEADER_RESERVED2(2),
   HEADER_MESSAGE_TYPE(4)

   public final int fieldSize;

    private FlatFileHeaderMapping(int fieldSize) {
        this.fieldSize = fieldSize;
   }

}

который я могу затем использовать, помещает каждую строку в карту и позже получает доступ к ключам на карте через это перечисление (например, символы)

Перечисление не имеет такого качества, насколько я могу видеть, и классы case не упорядочены, как объявления перечисления, поэтому их нельзя использовать для сопоставления макета записи, как показано выше. По крайней мере, не без поддержки упорядоченной коллекции.

Я мог бы пропустить что-то очевидное, поэтому вопрос!

Спасибо

Луч

4b9b3361

Ответ 2

overthink является правильным, но существует менее верный способ объявления объектов case:

sealed abstract class FlatFileHeaderMapping(val fieldSize: Int)
case object HEADER_EL extends FlatFileHeaderMapping(1)
case object HEADER_RESERVED1 extends FlatFileHeaderMapping(5)
case object HEADER_RESERVED2 extends FlatFileHeaderMapping(2)
case object HEADER_MESSAGE_TYPE extends FlatFileHeaderMapping(4)

Ответ 3

Вы можете попробовать использовать case object s:

sealed trait FlatFileHeaderMapping { val fieldSize: Int }                                                                                                                                                                          
case object HEADER_EL extends FlatFileHeaderMapping { val fieldSize = 1 }                                                                                                  
case object HEADER_RESERVED1 extends FlatFileHeaderMapping { val fieldSize = 5 }                                                                                           
case object HEADER_RESERVED2 extends FlatFileHeaderMapping { val fieldSize = 2 }                                                                                           
case object HEADER_MESSAGE_TYPE extends FlatFileHeaderMapping { val fieldSize = 4 } 

Затем вы можете использовать перечисление следующим образом:

object Test {                                                                                                                                                              
  def foo(x: FlatFileHeaderMapping) {                                                                                                                                      
    val result =                                                                                                                                                           
      x match {
        case HEADER_EL => "it a HEADER_EL!"                                                                                                                              
        case other => "its field size is: " + other.fieldSize                                                                                                             
      }                                                                                                                                                                    
    println(result)                                                                                                                                                        
  }                                                                                                                                                                        

  def main(args: Array[String]) {                                                                                                                                          
    foo(HEADER_EL)                                                                                                                                                         
    foo(HEADER_MESSAGE_TYPE)                                                                                                                                               
  }                                                                                                                                                                        
}

Основная информация, которую вы получаете здесь, - это проверка времени компиляции, когда обрабатываются все значения перечисления. то есть в коде x match { ... } выше вы получите ошибку компиляции, если у вас не было предложения 'case other = > ... `.

В основном я просто пересматриваю этот ответ, в котором перечислены плюсы и минусы этого подхода.

Ответ 4

object Direction extends Enumeration {
  val North = Value("North")
  val East = Value("East")
  val South = Value("South")
  val West = Value("West")
}

scala> import Direction._
scala> values foreach println
scala> val map = HashMap(North -> 1, South -> 2)

Ответ 5

На это отвечает Перечисление с помощью таблицы конструктора и поиска

Для целочисленного значения существует более простое решение:

object FlatFileHeaderMapping extends Enumeration  {
   type FlatFileHeaderMapping = Value 
   val HEADER_EL = Value(1, "HEADER_EL")
   val HEADER_RESERVED1 = Value(5, "HEADER_RESERVED1")
   val HEADER_RESERVED2 = Value(2, "HEADER_RESERVED2")
   val HEADER_MESSAGE_TYPE = Value(4, "HEADER_MESSAGE_TYPE")
}