По какой конкретной причине язык Java инициализирует поля объектов автоматически? - PullRequest
7 голосов
/ 19 апреля 2011

"Язык Java автоматически инициализирует поля объектов, в отличие от локальных переменных методов, за которые программисты отвечают за инициализацию. Учитывая то, что вы знаете об анализе потоков данных внутри и между процедурами, объясните, почему разработчики языка могут сделал эти варианты дизайна. "

Это очевидно для меня, чтобы предотвратить ошибку. Однако что именно эта ошибка? Будет ли это сжатие возможного потока управления какого-либо данного метода?

Может ли кто-нибудь более подробно рассказать об этом? Буду очень признателен за помощь.

Ответы [ 2 ]

3 голосов
/ 19 апреля 2011

Внутри процедурный поток данных действительно легко сделать, поэтому очень легко проверить, инициализировано ли поле, и, если нет, выдать предупреждение (можно написать упрощенный алгоритм разрешимого кода, например, убедиться, что все ветвиif инициализирует переменную, и если одна ветвь этого не делает, происходит сбой, даже если ветка недоступна).

Действительно трудно сделать межпроцедурный поток данных, поэтому очень трудно проверить, было ли поле объекта когда-либо инициализировано где-нибудь в кодевы быстро попадете на неразрешимую территорию для любого разумного приближения).

Таким образом, Java делает первое и выдает ошибки во время компиляции, когда обнаруживает неинициализированные локальные переменные, но не делает последнее и инициализирует поля объекта их значениями по умолчанию.

1 голос
/ 19 апреля 2011

Не всегда они инициализируются.Объекты могут быть созданы без вызова какого-либо конструктора, используя отражения в сочетании с классом sun.misc.Unsafe или ObjectInputStream для доступа к этим классам закрытых собственных методов или напрямую через JNI.Они предназначены для сериализации / десериализации объектов и предполагают, что поля будут заполнены десериализатором.Что касается того, почему разработчики предпочли бы исключить прямой доступ к этим методам (т. Е. Без отражений), само собой разумеется, что указатели, оставшиеся в памяти, могут быть использованы для атак со стеком или возврата к lib-c.Очистка памяти, выделенной для этих «автоматически» для большинства программ, снижает риск безопасности, а также снижает вероятность ошибок.Также обратите внимание, что попытка прочитать локальную переменную, которая не была инициализирована, приводит к ошибке компиляции по той же причине

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...