Java afirma ser orientada a objetos y segura en cuanto a tipos, y Scala aún más.Java/Scala obtiene una referencia de campo de manera segura
Los campos de la clase interna están representados por la clase llamada Campo, a la que puede obtener una referencia a través de Reflection API.
Mi pregunta: ¿estos idiomas proporcionan alguna forma de obtener esa referencia de campo en un tipo seguro manera? (Y si no, ¿por qué no? Parece una deficiencia evidente)
Sería extremadamente útil al asignar un objeto a una representación externa, por ejemplo, a campos html en una plantilla, o a nombres de columna en una base de datos , para mantener los nombres de referencia automáticamente sincronizados.
Idealmente me gustaría decir algo como:
&(SomeClass.someField).name()
para obtener el nombre de la declaración de campo, similar a cómo las enumeraciones de Java le permiten decir:
MyEnum.SOME_INSTANCE.name()
[actualización] después de leer los comentarios de que esta funcionalidad de alguna manera violaría la intención de Reflection API, acepto que Reflection está diseñado para cosas que no se conocen en tiempo de compilación, y es exactamente por eso que es tan absurdo tener que usarlo para aprender cosas que son conocido en tiempo de compilación, es decir, los campos de la misma clase que está compilando!
El compilador proporciona esto para enumeraciones, por lo que si el compilador puede acceder a la referencia del campo enum para permitir MyEnum.SOME_INSTANCE.name(), entonces no hay ninguna razón lógica por la que no debería ser capaz de proporcionar este mismo funcionalidad a las clases ordinarias.
¿Hay alguna razón tecnológica por la cual esta funcionalidad no podría estar disponible para las clases ordinarias? No veo por qué no, y no estoy de acuerdo con que esta funcionalidad pueda "complicar" las cosas ... por el contrario, simplificaría en gran medida las engorrosas técnicas actuales de Reflection API. ¿Por qué obligar a los desarrolladores a Reflection a descubrir algo que se conoce en tiempo de compilación?
[actualización n.º 2] en cuanto a la utilidad de esta función, ¿alguna vez ha intentado utilizar la API de criterios en JPA o Hibernate para construir dinámicamente una consulta? ¿Has visto las absurdas soluciones que la gente ha inventado para evitar tener que pasar una representación insegura de String del campo para consultar?
[actualización # 3] Finalmente, un nuevo lenguaje JVM llamado Ceylon ha atendido la llamada y hace que este trivial haga!
Realmente no entiendo su punto. Si '& (SomeClass.someField) .name()' se puede detectar estáticamente, ¿por qué no simplemente escribir 'SomeClass.someField.name()'? Es 'SomeClass.someField' una cadena? En caso afirmativo, ¿cómo debe el compilador reconocer su valor (se puede completar en tiempo de ejecución)? – sschaef
El punto no es obtener el valor de String, sino obtener el nombre que ha asignado a ese campo de String. Por ejemplo, si el campo se definió como: public String title = "president"; luego quiero llamar a & (SomeClass.title) .name() y obtener el "título" – Magnus
Si conoce el nombre, ¿por qué no simplemente acceder a él directamente? Mencionaste algo con "nombres de columna en una base de datos", pero cuando cambias el campo también tienes que cambiar todas las referencias a él. Y esto se puede hacer con IDEs modernos sin usar la función que desea tener. – sschaef