2016-08-24 3 views
1

Я создаю этот объект в REPL. И затем проверили его последовательность настройки на прилагаемом изображении ниже. Результаты сбивают с толку.Порядок построения вложенных объектов и переменных-членов

object T { 
    val default = A 
    var options = List[P]() 
    println(options) 

    sealed trait P 

    object A extends P { 
    override def toString = "A" 
    println(T.options) 
    println("A") 
    } 

    object B extends P { 
    override def toString = "B" 
    println(T.options) 
    println("A") 
    } 

    object C extends P { 
    override def toString = "C" 
    println(T.options) 
    println("A") 
    } 
} 
  1. В первом запуске, Т, только внутренний объект А, кажется, будет построен. Почему объект B и объект C ничего не печатают?

  2. Также обратите внимание, что println (T.options) в первом запуске возвращает «null». Это потому, что устанавливаются первые внутренние объекты, а затем устанавливаются внешние объекты других членов?

  3. При вводе T.A ничего не печатается, потому что объект уже настроен.

  4. При вводе T.B он устанавливает объект B и правильно печатает T.options i.e List() вместо null.

enter image description here

ответ

4

В первом запуске, T, только внутренний объект A кажется, будет построен. Почему нет объекта B и объект C распечатать что-нибудь ??

Поскольку они не инициализируется, они только объявили. Причина A печатает из-за:

val default = A 

Что вызывает A для инициализации. Порядок инициализации, таким образом:

  1. T сек default переменная вызывает A, чтобы инициализировать
  2. A инициализируется и отпечатки null
  3. T Теперь продолжает инициализации и теперь устанавливает значение options

Любые далее вызов будет теперь распечатывать содержимое списка вместо null.

Также обратите внимание, что println(T.options) в первом запуске возвращает «null». Это это потому, что первые внутренние объекты настроены, а затем внешние объекты другие участники настроены?

Это потому, что println(T.options) происходит в A конструктору, который до вашего options инициализации внутри T конструктору.

При вводе T.A ничего не печатается, потому что объект уже настроен.

Это имеет смысл, A ничего нового не требует инициализации.

На вводе T.B он устанавливает B объект и печатает T.options правильно List() то есть вместо того, чтобы null.

Это правильно, потому что, когда вы вызываете T.B, вы уже инициализирован список с помощью T конструктору.

+0

Спасибо за подробное объяснение. «Val default = A» был дьяволом здесь. :( – Samar

+0

@Samar Приветствую вас. Да, вот что вызвало каскад призывов. –

Смежные вопросы