Me preguntaba cómo costoso computacionalmente está utilizando operador instanceof en Java y quería saber si hay mejores alternativas disponiblescomplejidad de Java operador instanceof
Respuesta
La alternativa es evitar el uso instanceof
y diseñar sus clases correctamente (en OO sentido).
Como el operador instanceof
tiene una correspondiente instrucción de código de bytes "instanceof", probablemente no habrá un enfoque más eficaz; pero esto también puede depender de cómo se optimice la JVM real.
Esto es más un comentario que una respuesta. La pregunta es esencialmente: "Para hacer X (donde X no se expresa) debo hacer Y, ¿qué tan rápido es Y y hay alternativas?" Propones no hacer X en absoluto, lo cual no está abordando el punto de OP. –
@MichaelMcGowan: Desde mi experiencia, 'instanceof' a menudo está relacionado con un mal diseño. Para mí, no usarlo es la mejor alternativa. Y si no lo está usando, no necesita preocuparse por su rendimiento. – jeha
Estoy totalmente de acuerdo en que * a menudo * está relacionado con un mal diseño. Sin embargo, eso no significa que siempre es el caso, y, a veces, por diversas razones, uno tiene un mal diseño. –
Si desea comprobar si el objeto es una instancia de una clase determinada (pero no si extends
o implements
ella), tal vez la comparación de las clases con ==
sería más rápido:
o.getClass() == YourClass.class
De lo contrario ya que la instanceof
palabra clave ha sido creada para este propósito específico No veo cómo podría hacerlo mejor ..
No creo que esto sea más rápido, porque 'ref instanceof class' se asigna directamente a la operación de código byte' instanceof'. Su enfoque agrega el método llamado 'getClass'. –
La comparación que está intentando con 'getClass' no funcionará cuando intente comprobar si el objeto también pertenece a una determinada subclase. Por ejemplo, si tiene 'FileReader' extendiendo' InputStreamReader' que a su vez extiende/implementa 'Reader', llamar' getClass' en un objeto instanciado con 'new FileReader' nunca rendirá nada más que la clase' FileReader', y entonces ' o.getClass() == Reader' o 'o.getClass() == InputStreamReader' ambos evaluarán a' false'. 'instanceof', por otro lado, arrojará' verdadero' en los tres casos de clase. – amn
Supongo que realmente ha perfilado su código y encontró que su uso de instanceof
es un golpe de rendimiento no trivial? Si no es así, casi con seguridad estás resolviendo un problema que no merece la pena resolver.
Si todo lo que estamos haciendo es un código como éste:
if (something instanceof MyClass) {
MyClass mySomething = (MyClass) something;
//...
} else {
//exceptional case
}
entonces podría ser posible tratar el elenco primera, y permitir que el ClassCastException
que sea su "caso excepcional":
try {
MyClass mySomething = (MyClass) something;
} catch (ClassCastException cce) {
//exceptional case
}
Ahora, aunque puede ser prematuro optimización, no sería prematuro repensar su diseño. El uso excesivo de instanceof
es un olor de diseño. En general, debe usar genéricos y polimorfismos de manera que se reduzca la cantidad de veces que usaría instanceof
(y de hecho, fundición) hasta (casi) cero.
Si código diferente se debe ejecutar en función del tipo del objeto, considerar la posibilidad de que el código un método de instancia del objeto y que tiene los diferentes tipos se ajustan a una interfaz.
Si te das cuenta de que un objeto es de cierto tipo pero has hecho algún paso que haga que el compilador pierda el rumbo de ese hecho (por ejemplo, lo pones en
List
crudo), podría ser un candidato para la genificación.
instanceof
es bastante malditamente rápido. Sin embargo, generalmente es un síntoma de un diseño mal pensado.
Tendrá el mismo rendimiento que un elenco (exitoso), ya que está haciendo casi lo mismo. De hecho, la tarea es más o menos equivalente a una llamada a un método "virtual".
Implementaciones seguras: para las clases, solo se trata de obtener la clase de tiempo de ejecución y observar un desplazamiento fijo para verificar la superclase (siempre que no tenga una cadena de herencia de más de ocho clases para HotSpot) . Las interfaces son un poco más complicadas, pero generalmente tienen los últimos dos casos usados para cualquier clase de tiempo de ejecución en caché. Entonces eso también es rápido.
- 1. Java isInstance vs instanceOf operator
- 2. Java: Instanceof y genéricos
- 3. Evitar instanceof en Java
- 4. Cuándo usar Class.isInstance() y cuándo usar el operador instanceof?
- 5. java: instanceof y cast combinados?
- 6. Impacto de 'instanceof' en Android código Java
- 7. Observando múltiples observables mientras se evita el operador instanceof en java?
- 8. Java: ¿hay una "subclase" como instanceof?
- 9. Java gama reflexión: isArray vs instanceof
- 10. Lo contrario de instanceof
- 11. ¿Está utilizando el operador instanceof en javascript un problema de rendimiento?
- 12. F # es igual a la complejidad del operador
- 13. java == operador
- 14. Patrón de visitante de Java en lugar de instanceof switch
- 15. Herencia de Java y evitar el uso constante de instanceof
- 16. Deshacerse de `instanceof`
- 17. Manipular PHP-instanceof-operator para wrapper-class
- 18. Complejidad del tiempo del conjunto en Java
- 19. Complejidad del tiempo para java ArrayList
- 20. ¿Hay algo como instanceOf (clase <?> c) en Java?
- 21. Herencia de Javascript - instanceof no funciona?
- 22. CoffeeScript: El uso de instanceof vs Class.constructor.name
- 23. Java - Objeto instanceof nula se evalúa como verdadera y falsa
- 24. Operador Java Lanzador nativo
- 25. Java?: Operador en vb.net
- 26. ^operador en java
- 27. Java | = pregunta del operador
- 28. extraño comportamiento de Java operador + =
- 29. Multiple instanceof cheques
- 30. Javascript instanceof Si Declaración
Si hay alguna alternativa depende de lo que necesite hacer ... –