Бакки Бугвин (bukky_boogwin) wrote,
Бакки Бугвин
bukky_boogwin

Задача

Запись будет интересна только программистам.

С этой ситуацией я столкнулся в ходе работы и довольно долго ломал над ней голову. Возможно, для искушенного Java-программиста она окажется тривиальной, но мне, когда я понял, в чем дело, ситуация показалась любопытной - в частности и тем, что проблема хорошо формулируется в форме обобщенной задачи.
Итак: имеется несериализуемый класс Java. Первый оператор в его коде - объявление нестатического приватного поля произвольного (т. е. не имеющего значения для задачи) типа. Поле инициализируется сразу при объявлении значением, которое заведомо не null и (для поля примитивного типа) не 0 - скажем, вызовом соответствующего конструктора или литералом, если это возможно.
Компиляция происходит без проблем, но в ходе выполнения при единственное во всем коде обращение к этому полю оказывается, что оно не проинициализировано: скажем, попытка вызвать какой-то метод этого поля, если оно объектное, вызывает NullPointerException. В какой ситуации такое должно произойти?
Решение прячу под кат и к тому же - для желающих попредлагать варианты, не глядя на ответ, - пишу белым по белому; для прочтения текст нужно выделить.
Суть такова: у нашего класса имеется абстрактный суперкласс. У суперкласса определен конструктор, который, разумеется, вызывается конструктором нашего класса. Конструктор родителя вызывает метод, который в родителе определен как абстрактный, а реализован именно в нашем классе. И именно в этой реализации абстрактного находится то самое единственное обращение к полю. При попытке сконструировать экземпляр нашего класса и оказывается, что поле ведет себя как неинициализированное.
Дело, насколько я понимаю, в том, что методу самого нашего класса доступ к полям, разумеется, открыт, но вот его собственные, не унаследованные поля инициализированы быть еще не могут, т. к. собственно экземпляр класса еще не начал создаваться.
Любопытно: как обрабатывается аналогичная ситуация в других подобных языках? Кто может, попробуйте проверить.

Tags: java, компьютерное, программирование, фишки
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 4 comments