Как создать структурный тип в Scala? - PullRequest
0 голосов
/ 07 мая 2019

Я пытаюсь создать структурный тип в Scala, чтобы избежать определения промежуточных классов. По сути, я просто хочу определить структуру, которая будет маршалироваться / демаршалироваться в / из строки JSON.

Например, для описания следующего JSON

{
    "query": {
        "range" : {
            "number" : {
                "gte": 123, 
                "lte": 456
            }
        }
    }
}

У меня есть соответствующий структурный тип:

  //structural
  type NumberRange = {val range: {val number: {val gte: Long; val lte: Long}}}

  //named
  case class NumberRangeQuery(query: NumberRange)

  //instance
  val nrq: NumberRangeQuery = ???

Каков будет правильный способ создания экземпляра NumberRangeQuery?

Ответы [ 2 ]

0 голосов
/ 07 мая 2019

Ответ в этом случае заключается не в использовании структурных типов, а в том, чтобы тратить усилия на использование классов case и сделать код намного более читабельным и эффективным:

case class Number(gte: Long, lte: Long)
case class Range(number: Number)
case class Query(range: Range)
case class NumberRangeQuery(query: Query)

val nrq: NumberRangeQuery = NumberRangeQuery(
  Query(
    Range(
      Number(1, 3)
    )
  )
)

Почему вы должны выбирать структурные типы вместо конкретныхтипы в этом случае?

0 голосов
/ 07 мая 2019

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

//instance
  val nrq: NumberRangeQuery = NumberRangeQuery(new {
    val range = new {
      val number = new {
        val gte = 1: Long 
        val lte = 3: Long
      }
    }
  })

Обратите внимание, что создание экземпляров «анонимных» структурных типов имеет как минимум 2 штрафа:

1) Это возможно читаемый код
2) Scala будет использовать отражение во время выполнения для отправки методов в таких случаях ( обсуждение здесь )

...