Viniendo de un fondo C y C ++, encontré el uso juicioso de typedef
ser increíblemente útil. ¿Conoces una manera de lograr una funcionalidad similar en Java, ya sea un mecanismo, patrón u otra forma efectiva de Java que hayas utilizado?
244
public interface ScopeFactory { <Scope extends Map<String, Object>> Scope create(...) throws Exception; }
Respuestas:
Java tiene tipos, objetos y matrices primitivos y eso es todo. No typedefs.
fuente
typedef
volver a definirboolean
abool
.typedef int PlayerID
que permite que el compilador se asegure de que los ID de jugador no se usen indistintamente con otras entradas, y también hace que el código sea mucho más legible para los humanos . Básicamente, es como una enumeración pero sin un conjunto limitado de valores.typedef MegaLongTemplateClass<With, Many, Params> IsShorten;
.typedef
no habilita tal cosa. Simplemente le da otro nombre a un tipo.int
y necesita cambiarlolong
, debe cambiarlo en todos los lugares del código donde trabaja con el ID. Si lo hubiera hechotypedef
, solo tendría que cambiarlo en 1 lugar.Si esto es lo que quiere decir, simplemente puede extender la clase que le gustaría escribir def, por ejemplo:
fuente
typedef
no tiene ninguno de los problemas que el artículo describe para esas clases falsas (y son muy reales).final
clases.No hay typedef en java a partir de 1.6, lo que puede hacer es crear una clase wrapper para lo que desea, ya que no puede subclasificar las clases finales (Integer, Double, etc.)
fuente
Como otros han mencionado antes,
no existe un mecanismo typedef en Java.
Tampoco apoyo "clases falsas" en general, pero no debería haber una regla general estricta aquí:
si su código, por ejemplo, usa una y otra vez un "tipo genérico", por ejemplo:
Definitivamente deberías considerar tener una subclase para ese propósito.
Otro enfoque que uno puede considerar es, por ejemplo, tener en su código una desaceleración como:
Y luego use en su código NameToNumbers y tenga una tarea de precompilador (ANT / Gradle / Maven) para procesar y generar el código Java relevante.
Sé que para algunos de los lectores de esta respuesta esto puede sonar extraño, pero esta es la cantidad de marcos implementados "anotaciones" antes de JDK 5, esto es lo que está haciendo el proyecto lombok y otros marcos.
fuente
Realmente, el único uso de typedef que se transfiere a Javaland es el alias, es decir, dar a la misma clase múltiples nombres. Es decir, tienes una clase "A" y quieres que "B" se refiera a lo mismo. En C ++, estarías haciendo "typedef BA;"
Desafortunadamente, simplemente no lo admiten. Sin embargo, si controla todos los tipos involucrados, PUEDE hacer un truco desagradable a nivel de la biblioteca: puede extender B desde A o hacer que B implemente A.
fuente
typedef
también sería útil para crear alias para invocaciones de tipos genéricos. Por ejemplo:typedef A<Long,String> B;
(este puede ser un caso especial de lo que ha descrito, pero muestra el atractivo de la idea un poco más claramente).real_t
pordouble
ybool
paraboolean
.Quizás esto podría ser otro posible reemplazo:
fuente
myMap
instancia de tipoMyMap
, puede operar en HashMap real solo escribiendo enmyMapInstance.value.SomeOperation()
lugar de hacerlomyMapInstance.SomeOperation()
? Esto es molesto, ¿no?Como se señaló en otras respuestas, debe evitar el antipatrón pseudo-typedef . Sin embargo, los typedefs siguen siendo útiles incluso si esa no es la forma de lograrlos. Desea distinguir entre diferentes tipos abstractos que tienen la misma representación de Java. No desea mezclar cadenas que son contraseñas con aquellas que son direcciones de calles, o enteros que representan un desplazamiento con aquellos con aquellos que representan un valor absoluto.
El marco del inspector le permite definir un typedef de una manera compatible con versiones anteriores. Incluso trabajo para clases primitivas como
int
y clases finales comoString
. No tiene sobrecarga en tiempo de ejecución y no rompe las pruebas de igualdad.La sección Alias de tipo y typedefs en el manual de Checker Framework describe varias formas de crear typedefs, según sus necesidades.
fuente
Kotlin admite alias de tipo https://kotlinlang.org/docs/reference/type-aliases.html . Puede renombrar tipos y tipos de funciones.
fuente
En algunos casos, una anotación vinculante puede ser justo lo que está buscando:
https://github.com/google/guice/wiki/BindingAnnotations
O si no quieres depender de Guice, solo una anotación regular podría servir.
fuente
Podría usar una Enum, aunque es semánticamente un poco diferente a un typedef, ya que solo permite un conjunto restringido de valores. Otra posible solución es una clase de contenedor con nombre, p. Ej.
pero eso parece mucho más torpe, especialmente dado que no está claro en el código que la clase no tiene otra función que un alias.
fuente
Typedef permite que los elementos se asignen implícitamente a tipos que no son. Algunas personas intentan solucionar esto con extensiones; lea aquí en IBM para obtener una explicación de por qué es una mala idea.
Editar: Si bien la inferencia de tipo fuerte es algo útil, no creo (y espero que no lo veamos)
typedef
criar su cabeza fea en lenguajes administrados (¿alguna vez?).Edición 2: en C #, puede usar una declaración de uso como esta en la parte superior de un archivo fuente. Se usa para que no tenga que hacer el segundo elemento que se muestra. La única vez que ve el cambio de nombre es cuando un ámbito introduce una colisión de nombre entre dos tipos. El cambio de nombre está limitado a un archivo, fuera del cual cada variable / tipo de parámetro que lo usó se conoce por su nombre completo.
fuente
No hay necesidad de typedef en Java. Todo es un Objeto excepto las primitivas. No hay punteros, solo referencias. Los escenarios en los que normalmente usaría typedefs son instancias en las que crea objetos en su lugar.
fuente
UnmodifiableDirectedGraph<IncrediblyFancyEdgeType, IncrediblyFancyAbstractNode.EvenFancierConcreteNode>
oIncrediblyFancyGraph
? Siempre puedo referirme a la definición para averiguar de qué se trata realmente. De esa manera, también puedo estar seguro de que noUnmodifiableDirectedGraph<IncrediblyFancyEdge,IncredilyFancyAbstractNode.SlightlyLessFancyConcreteNode>
perderé el aburrimiento.Enterprise
.