Java утверждает, что он является объектно-ориентированным и типичным, и Scala тем более.
Внутренние поля класса представлены классом Field, который вы можете получить с помощью API Reflection.
Мой вопрос: предоставляют ли эти языки какой-либо способ получить ссылку на поле в стиле typeafe? (А если нет, то почему на земле нет? Похоже на вопиющий недостаток)
Было бы очень полезно при сопоставлении объекта с каким-либо внешним представлением, например с html-полями в шаблоне, или с именами столбцов в базе данных, чтобы сохранить имена ссылок автоматически в синхронизации.
В идеале я хотел бы сказать что-то вроде:
&(SomeClass.someField).name()
чтобы получить имя объявления поля, похожее на то, как перечисление java позволяет вам сказать:
MyEnum.SOME_INSTANCE.name()
[update:] после прочтения отзывов о том, что эта функциональность каким-то образом нарушит намерение API Reflection, я согласен с тем, что Reflection предназначен для вещей, которые неизвестны во время компиляции, и что именно поэтому настолько абсурдно иметь используйте его, чтобы узнать, что известно во время компиляции, а именно поля самого класса, которые он компилирует!
Компилятор предоставляет это для перечислений, поэтому, если компилятор может получить доступ к ссылке enum Field, чтобы разрешить MyEnum.SOME_INSTANCE.name(), тогда нет никакой логической причины, почему она также не может предоставить эту же функциональность для обычных классов.
Есть ли технологическая причина, почему эта функция не может быть доступна для обычных классов? Я не понимаю, почему нет, и я не согласен с тем, что эта функциональность "усложнит" вещи... напротив, это значительно упростит нынешние громоздкие методы API Reflection. Зачем заставить разработчиков в Reflection обнаруживать то, что известно во время компиляции?
[update # 2] как для полезности этой функции, вы когда-нибудь пробовали использовать API критериев в JPA или Hibernate для динамического построения запроса? Видели ли вы абсурдные методы работы, которые люди придумали, чтобы избежать необходимости передавать небезопасное строковое представление поля для запроса?
[обновление # 3] Наконец, новый JVM-язык под названием Ceylon прислушался к вызову и делает это тривиальным для выполнения!