Рассмотрим следующий случай (это упрощенная версия того, что у меня есть. numberOfScenarios - самая важная переменная здесь: я обычно использую жестко закодированное число вместо него, но я пытаюсь увидеть если возможно рассчитать значение):
object ScenarioHelpers {
val identifierList = (1 to Scenarios.numberOfScenarios).toArray
val concurrentIdentifierQueue = new ConcurrentLinkedQueue[Int](identifierList.toSeq)
}
abstract class AbstractScenario {
val identifier = ScenarioHelpers.concurrentIdentifierQueue.poll()
}
object Test1 extends AbstractScenario {
val scenario1 = scenario("test scenario 1").exec(/..steps../)
}
object Test2 extends AbstractScenario {
val scenario2 = scenario("test scenario 2").exec(/..steps../)
}
object Scenarios {
val scenarios = List(Test1.scenario1, Test2.scenario2)
val numberOfScenarios = scenarios.length
}
object TestPreparation {
val feeder = ScenarioHelpers.identifierList.map(n => Map("counter" -> n))
val prepScenario = scenario("test preparation")
.feed(feeder)
.exec(/..steps../)
}
Не уверен, имеет ли это значение, но симуляция начинается с выполнения TestPreparation.prepScenario.
Я вижу, что этот код содержит циклическую зависимость, которая делает этот случай невозможным сам по себе. Но я получаю исключение NullPointerException в строке в AbstractScenario, где идентификатор инициализируется.
Я не до конца понимаю все это, но я думаю, что это как-то связано с тем, что сначала просто объявляются значения val, а инициализация не происходит позже. Поэтому, когда идентификатор инициализируется, concurrentIdentifierQueue еще не инициализирован и, следовательно, имеет значение null.
Я просто пытаюсь понять причины, лежащие в основе исключения NullPointerException, а также есть ли способ заставить это работать с минимальными изменениями? Спасибо.