#scala #lazy-loading
#scala #отложенная загрузка
Вопрос:
У меня есть класс scala, как показано ниже
class Event {
val query: String =
s"""
| Created >= "2020-01-01" AND ${event_filter}
| """
.stripMargin
val event_filter: String =
s"""
| event= 'CreateTask'
| """
.stripMargin
}
И затем у меня есть класс тестирования ниже для проверки запроса события.
class EventTest extends FunSuite{
test ("testing event query") {
val obj:Event = new Event()
assert(obj.query == "Created >= "2020-01-01" AND event= "CreateTask" ")
}
}
Во время выполнения тестового примера я получаю несоответствие между фактическим и ожидаемым значением. Я получаю obj.запрос, подобный этому «Создан> = «2020-01-01″ И null».
Есть идеи, почему event_filter заполняется как null? Это потому, что переменные загружаются лениво?
Комментарии:
1. Потому что поля оцениваются по порядку. Самое простое решение — переместить
event_filter
раньшеquery
.2. Ах! имеет смысл. Спасибо.
3. другая возможность — использовать
lazy val
s
Ответ №1:
Как отмечалось в комментариях, это проблема с порядком инициализации. Вы можете исправить это, переупорядочив val
s или создав первое значение lazy val
, чтобы оно не вычислялось до его первого использования, что произойдет после инициализации второго.
class Event {
val event_filter: String =
s"""
| event= 'CreateTask'
| """
.stripMargin
val query: String =
s"""
| Created >= "2020-01-01" AND ${event_filter}
| """
.stripMargin
}
или
class Event {
lazy val query: String =
s"""
| Created >= "2020-01-01" AND ${event_filter}
| """
.stripMargin
val event_filter: String =
s"""
| event= 'CreateTask'
| """
.stripMargin
}