Eleneldil G. Arilou (arilou) wrote,
Eleneldil G. Arilou
arilou

Category:

О коварности ежей в костюмах ужей

Ранее я уже высказывал такую концептуальную претензию к языку 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.
Tags: c++, 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.
  • 0 comments