Java はオブジェクト指向でタイプセーフであると主張しており、Scala はそれ以上です。
内部クラス フィールドは、Reflection API を介して参照を取得できる Field と呼ばれるクラスによって表されます。
私の質問: これらの言語は、その Field 参照をタイプセーフな方法で取得する方法を提供していますか? (そして、もしそうでなければ、なぜ地球上ではないのですか? 明らかな欠陥のようです)
Object を何らかの外部表現 (テンプレートの html フィールドやデータベースの列名など) にマッピングして、参照名を自動的に同期させる場合に非常に便利です。
理想的には、次のようなことを言いたいです。
&(SomeClass.someField).name()
フィールド宣言の名前を取得するには、Java 列挙型で次のように言います。
MyEnum.SOME_INSTANCE.name()
[更新:] この機能が Reflection API の意図に何らかの形で違反するというフィードバックを読んだ後、Reflection はコンパイル時に未知のもののために設計されていることに同意します。コンパイル時にわかっていること、つまりコンパイルしているまさにそのクラスのフィールドを学びます!
コンパイラはこれを列挙型に提供するため、コンパイラが列挙型フィールドの参照にアクセスして MyEnum.SOME_INSTANCE.name() を許可できる場合、これと同じ機能を通常のクラスにも提供できない論理的な理由はありません。 .
この機能が通常のクラスに存在しない技術的な理由はありますか? なぜそうしないのかわかりませんが、この機能が物事を「複雑にする」ことに同意しません...逆に、現在の面倒なReflection APIテクニックを大幅に簡素化します。開発者に、コンパイル時にわかっていることを見つけるために、なぜ Reflection を強制するのでしょうか?
[更新 #2] この機能の有用性についてですが、JPA または Hibernate で Criteria API を使用してクエリを動的に構築しようとしたことがありますか? クエリ対象のフィールドの安全でない文字列表現を渡さなくて済むようにするために人々が思いついたばかげた回避策を見たことがありますか?
[更新 #3] 最後に、Ceylon と呼ばれる新しい JVM 言語がこの要求に注意を払い、これを簡単に実行できるようにしました。