🕵️♂️
Абсолютно с вами согласен. Но данный конструктор не несёт какой-либо особой смысловой нагрузки. Я сначала думал, что разницы нет, но потом вспомнил то, что я читаю и решил спросить, а то, если бы смысла в этой строчке не было, то её, скорее всего, и не вставили бы.
А где альтернатива?
Если инициализировать в методе push(), а клиент первым вызовет не его, метод pop()?
Тогда в реальности получит указатель на пустой стек. И нужно инициализировпть во всех методах внешнего АПИ.
Тогда проще просто инициализировпть в конструкторе, либо обьявлении - эти два варианта в однопоточном приложении по идее идентичны.
В многопоточном использовании, в варианте прямой инициализации можно по идее получить сайд-эффект. Т.к поле tos не final и не связано отношением happens before с выходом из конструктора, пользователь может начать использовать недосозданный обьект, даже если tos обьявить volatile (?может и ошибаюсь).
А в случае с инициализацией в конструкторе, клиент не получит ссылку на обьект до полной инициализации обьекта, даже в многопоточном приложении, там уже важней будет "синхронизировать" ссылку на сам объект.