Java/Scala получает ссылку на поле безопасным для типов способом.

Java претендует на то, чтобы быть объектно-ориентированным и типобезопасным, а Scala тем более.

Поля внутреннего класса представлены классом Field, ссылку на который можно получить через Reflection API.

Мой вопрос: предоставляют ли эти языки какой-либо способ получить эту ссылку на поле типобезопаснымспособом? (А если нет, то почему бы и нет? Кажется вопиющим недостатком)

Было бы чрезвычайно полезно при сопоставлении объекта с каким-либо внешним представлением, например, с полями html в шаблоне или с именами столбцов в базе данных, для автоматической синхронизации ссылочных имен.

В идеале я хотел бы сказать что-то вроде:

&(SomeClass.someField).name() 

чтобы получить имя объявления поля, аналогично тому, как перечисления в Java позволяют сказать:

MyEnum.SOME_INSTANCE.name()

[обновление:] после прочтения отзывов о том, что эта функциональность каким-то образом нарушит цель API Reflection, я согласен с тем, что Reflection предназначен для вещей, которые неизвестны во время компиляции, и именно поэтому так абсурдно иметь используйте его для изучения того, что известново время компиляции, а именно поля того самого класса, который он компилирует!

Компилятор предоставляет это для перечислений, поэтому, если компилятор может получить доступ к ссылке поля перечисления, чтобы разрешить MyEnum.SOME_INSTANCE.name(), то нет никакой логической причины, по которой он не мог бы предоставлять ту же функциональность обычным классам.

Есть ли какая-то технологическая причина, по которой эта функциональность не может быть в обычных классах? Я не понимаю, почему бы и нет, и я не согласен с тем, что эта функциональность "усложнит" вещи... напротив, она значительно упростит нынешние громоздкие методы Reflection API. Зачем заставлять разработчиков использовать Reflection, чтобы выяснить что-то, что известно во время компиляции?

[обновление № 2] Что касается полезности этой функции, пробовали ли вы когда-нибудь использовать Criteria API в JPA или Hibernate для динамического построения запроса? Вы видели абсурдные обходные пути, которые придумали люди, чтобы избежать необходимости передавать небезопасное строковое представление поля для запроса?

[обновление #3] Наконец, новый язык JVM под названием Ceylon прислушался к призыву и сделал это тривиальным!

10
задан Magnus 14 October 2015 в 14:07
поделиться