?

Log in

No account? Create an account

О коварности ежей в костюмах ужей - Узором созвездий по мантии ночи

28.10.2017, Суббота

20:19:00 - О коварности ежей в костюмах ужей

Previous Entry Поделиться Next Entry

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

Синтаксис Java слишком много взял от C++. Якобы для того, чтобы программисты на С++ (точнее, те, кто ничего, кроме С++ не признаёт и не понимает) переходили на Java легко и непринуждённо. Однако при этом в те же одежды синтаксиса порой рядится существенно иная тушка семантики.

На днях я порадовался об обобщённые (универсальные, генерики) методы и классы. Синтаксис мимикрирует под шаблоны C++, однако принципиальное отличие (если я всё верно понял) в том, что генерик-то компилируется ровно один раз и полностью обходится только тем, что ему на тот момент известно, в то время как шаблон на момент инстанцирования знает всё о типах параметров шаблона. Например, может вызвать конструктор объекта типа T (где T — параметр шаблона), обратиться к его статическим полям и методам и т.д.. В случае же джавы этого ничего нет.

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

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

В общем, моя претензия к джаве в неоправданной мимикрии под C++ лишь окрепла.

This entry was originally posted at https://arilou.dreamwidth.org/1001535.html. Please comment there using OpenID.