Se supone que las excepciones Singleton son una optimización del rendimiento. La idea es que elimine el costo de rellenar el seguimiento de la pila al crear una excepción que generalmente es la parte más costosa de las excepciones.
Si la excepción fuera lo suficientemente exclusiva y descriptiva, y no se usaría stacktrace, entonces un singleton podría ser efectivo. Puede diseñar la aplicación de modo que un tipo de excepción específico con un mensaje específico siempre signifique una excepción orgininated de una ubicación específica. Entonces la huella de la pila sería irrelevante.
El April 22, 2003 Tech Tips article describe un caso en el que reutiliza una excepción. En este caso, están intentando jugar con el recolector de basura reduciendo la cantidad de objetos creados. Si se salta la llamada populateStackTrace()
, no tendrá que preocuparse por enhebrar.
Generalmente, si el impacto en el rendimiento de una excepción está causando problemas, es un signo de que se están utilizando excepciones para la lógica de la aplicación y, en su lugar, se debe usar un código de error.
En JVMs más nuevas (1.4+, creo), esta "optimización" puede ser hecha automáticamente por la JVM cuando se ejecuta en modo "-server". Esta optimización de punto de acceso se puede controlar con la opción -XX:+OmitStackTraceInFastThrow
.
Personalmente, recomendaría no utilizar el patrón de excepción singleton [anti-].
Interesante respuesta. Estoy de acuerdo con tu tercer párrafo más fuertemente; las excepciones deben ser excepcionales y si se activan con la frecuencia suficiente como para causar un problema de rendimiento, debe reconsiderar su código. – Randolpho
Muy interesante respuesta. –
La JVM realmente comenzará a lanzar Singleton RuntimeExceptions (por ejemplo, NPE) si se lanza desde la misma ubicación varias veces, controlado por la opción '-XX: [+ -] OmitStackTraceInFastThrow' JVM. Por lo tanto, si alguien le envía un registro con un NPE y sin seguimiento, puede ser por eso :) – araqnid