Así que me encuentro haciendo algo así como el siguiente patrón a menudo. En lugar de:patrón java: cuando tiene sentido usar variables temporales
if (map.containsKey(someKey)) {
Value someValue = map.get(someKey);
...
}
Para no recorrer el mapa en dos ocasiones (y ya sé que mi mapa no almacena valores nulos), lo haré:
Value someValue = map.get(someKey);
if (someValue != null) {
...
}
Esto parece que sea una pena patrón dado que las operaciones Map
realizan un número decente de operaciones y el optimizador, supongo, no es lo suficientemente inteligente como para optimizarlo.
Pero luego me encuentro haciendo patrones similares en otras situaciones. Por ejemplo, ¿debo almacenar el resultado someMethod()
en una variable temporal en lugar de hacer la llamada dos veces? Claramente, no puedo llamar al someMethod()
dos veces si hay efectos secundarios, pero ¿cuándo tiene sentido llamarlo solo una vez desde el punto de vista de la optimización?
if (someObject.someMethod() != null) {
processSomehow(someObject.someMethod());
}
Sé que esto raya en una pregunta "no constructiva", así que estoy en busca de respuestas que presentan algunos datos y referencias en lugar de sólo una conjetura.
- ¿Cuándo tiene sentido hacer esto y cuándo no?
- ¿Cómo debo evaluar el "costo" del
someMethod()
para determinar cuándo se debe usar una variable temporal? - Para métodos simples como obtener métodos, ¿podría esto interferir con el compilador del punto de acceso o el optimizador y producir un código menos eficiente?
Para la posteridad, no estoy preguntando "cómo puedo mejorar la velocidad de mi programa existente". Estoy tratando de descubrir "qué patrón debo usar cuando escribo el código futuro".
Gracias por cualquier información.
Creo que la respuesta a todas estas preguntas implica la palabra "profiler" ... –
Claramente, si 'someMethod()' es costoso o tiene efectos secundarios, no desea llamarlo dos veces. Java no contiene (todavía) una palabra clave 'idempotent' (trae recuerdos viejos de' reducible' en PL/1 :-) –
Buen punto @Jim. He editado mi pregunta para dejar en claro que no estoy hablando de efectos secundarios. Pero de lo que estoy hablando es de cómo evaluar el "gasto" del método. – Gray