Java声称是面向对象的,类型安全的,而Scala更是如此。Java/Scala以类型安全的方式获取字段引用
内部类字段由称为字段的类表示,您可以通过反射API获取引用。
我的问题:这些语言是否提供任何方式来获得类型安全方式中的字段引用? (如果不是,为什么不是这样?看起来像是一个明显的缺陷)
当将一个Object映射到某个外部表示(例如模板中的html字段或数据库中的列名)时,这将非常有用,以保持参考名称自动同步。
理想我想这样说:
&(SomeClass.someField).name()
获取字段声明,类似的名称了Java枚举让你说:
MyEnum.SOME_INSTANCE.name()
[更新:]在阅读反馈意见之后,这个功能会以某种方式违反Reflection API的意图,我同意Reflection是针对在编译时不为人知的事情而设计的,这就是为什么使用它来学习那些事情是如此荒谬的原因:是在编译时已知,即它正在编译的类的字段!
编译器为枚举提供了这个功能,所以如果编译器能够访问枚举Field的引用以允许MyEnum.SOME_INSTANCE.name(),那么为什么它不应该也能够提供相同的逻辑原因功能到普通的类。
是否有任何技术原因,为什么这个功能不能用于普通类?我不明白为什么不这样做,我不同意这种功能会使事情“复杂化”......相反,它将极大地简化目前繁琐的Reflection API技术。为什么要迫使开发人员加入Reflection来找出编译时已知的东西?
关于此功能的实用程序[更新#2],您是否尝试过使用JPA或Hibernate中的Criteria API来动态构造查询?你有没有看到人们想出的荒谬的解决方法,试图避免不必要传递字段的不安全字符串表示来查询?
[update#3]最后,一个名为Ceylon的新JVM语言已经注意到了这个呼叫,并使这trivial做!
我真的不明白你的意思。如果'&(SomeClass.someField).name()'可以静态检测,为什么不直接写'SomeClass.someField.name()'? SomeClass.someField是一个字符串吗?如果是,编译器应该如何识别它的值(它可以在运行时填充)? – sschaef 2012-03-24 23:36:31
重点不在于获取字符串的值,而是为了获取已分配给该字符串字段本身的名称。例如,如果该字段被定义为:public String title =“president”;那么我想调用&(SomeClass.title).name()并取回“标题” – Magnus 2012-03-25 02:13:19
如果你知道名称为什么不直接访问它?您提到了“数据库中的列名”,但是当您更改该字段时,还必须更改对其的所有引用。这可以用现代的IDE来完成,而不需要使用你想要的功能。 – sschaef 2012-03-25 11:23:55