parameter - En Java, ¿cuándo debería usar "Object o" en lugar de genéricos?
java generics parameter (5)
Por ejemplo, podría escribir cualquiera de estos:
class example <T>
{
...
public void insert (T data)
{
...
}
}
o
class example
{
...
public void insert (Object o)
{
...
}
}
¿Hay una diferencia significativa entre los 2 en términos de rendimiento? Con genéricos podría restringir el tipo de parámetro y con el segundo enfoque supongo que no sería necesario definir el tipo de objeto a medida que se crea.
Además, con el segundo enfoque, básicamente podría insertar cualquier cosa en la clase, ¿verdad? Mientras que con los genéricos, todos los elementos de la clase serían del mismo tipo.
¿Me falta algo más?
Algunos de los encuentros donde tuve que usar ''Objeto'' en lugar de Genéricos fueron los de compulsión que de elección. Cuando se trabaja con códigos pregenéricos o bibliotecas construidas en torno a una API pregenérica, uno tiene pocas opciones. Proxies dinámicos, por ejemplo, Proxy.newProxy () devuelve Tipo de objeto. Pasar contexto genérico (donde un contexto puede ser cualquier cosa) es otra instancia. Algunos de mis amigos argumentan que son tan buenos como los no genéricos. En lo que respecta al rendimiento, no debería haber ningún gasto adicional, teniendo en cuenta el borrado de tipo.
Creo que casi lo has logrado. No hay diferencia de rendimiento Los genéricos se racionalizan ( Type Erasure ) cuando se compila el código y ya no existen en el tiempo de ejecución. Simplemente agregan yesos cuando es necesario y hacen la verificación de tipos como usted indicó. Neal Gafter escribió una buena visión general de cómo funcionan, de los problemas actuales con Generics y cómo podrían resolverse en la próxima versión de Java: http://gafter.blogspot.com/2006/11/reified-generics-for- java.html
En cuanto al rendimiento, estoy de acuerdo con las personas de arriba.
En relación con este punto tuyo
"Además, con el segundo enfoque, básicamente podría insertar cualquier cosa en la clase, ¿verdad? Mientras que con los genéricos, cada elemento de la clase sería del mismo tipo".
Una ventaja más de los genéricos es que hay una verificación de tipo para la asignación de la instancia de ejemplo en sí.
Digamos, por ejemplo, que tenía un ejemplo e1 de y otro ejemplo e2 de, tipo de seguridad se mantendría y nunca podría hacer e1 = e2;
mientras que con el ejemplo del objeto, eso sería posible.
La única razón para escribir esto último es si debe apuntar a una JVM anterior. Los genéricos se implementan mediante borrado de tipo, por lo que no tienen impacto en el tiempo de ejecución, solo se agrega la verificación del tiempo de compilación, lo que mejorará su código.
Por supuesto, si necesita una colección que contiene cualquier objeto antiguo, o una combinación de varios que no tienen una superclase común, necesita la variación simple del Objeto (pero luego su clase aún puede ser genérica e instanciada con nueva ... < Objeto>).
No debería haber una diferencia de rendimiento.
Sin embargo, Java no ofrece varianza de parámetros, por lo que hay situaciones en las que se anularán las funciones pre-genéricas como equals, compareTo, etc., donde tendrá que usar Objects.