solucion fields exceptionininitializererror java exception static final initializer

fields - static class java



Cómo manejar un inicializador de campo final estático que arroja una excepción marcada (3)

Me enfrento a un caso de uso en el que me gustaría declarar un campo static final con una declaración de inicializador que se declara arrojar una excepción marcada. Por lo general, se vería así:

public static final ObjectName OBJECT_NAME = new ObjectName("foo:type=bar");

El problema que tengo aquí es que el constructor de ObjectName puede arrojar varias excepciones comprobadas, que no me importa (porque sabría que mi nombre es válido, y está bien si falla miserablemente en caso de que no lo sea). El compilador de Java no me deja ignorar esto (ya que es una excepción comprobada), y preferiría no recurrir a:

public static final ObjectName OBJECT_NAME; static{ try{ OBJECT_NAME = new ObjectName("foo:type=bar"); }catch(final Exception ex){ throw new RuntimeException("Failed to create ObjectName instance in static block.",ex); } }

Porque los bloques estáticos son muy difíciles de leer. ¿Alguien tiene una sugerencia sobre cómo manejar este caso de una manera agradable y limpia?


Si no te gustan los bloques estáticos (algunas personas no), entonces una alternativa es usar un método estático. IIRC, Josh Bloch lo recomendó (aparentemente no en Java efectivo en una inspección rápida).

public static final ObjectName OBJECT_NAME = createObjectName("foo:type=bar"); private static ObjectName createObjectName(final String name) { try { return new ObjectName(name); } catch (final SomeException exc) { throw new Error(exc); } }

O:

public static final ObjectName OBJECT_NAME = createObjectName(); private static ObjectName createObjectName() { try { return new ObjectName("foo:type=bar"); } catch (final SomeException exc) { throw new Error(exc); } }

(Editado: segundo ejemplo corregido para regresar del método en lugar de asignar el static ).


Tu código es perfectamente válido. No me resulta difícil leer. Otras formas solo lo empeorarían. Para empezar son difíciles de leer, porque la mayoría de ellos no están familiarizados con eso. Simplemente siga las convenciones estándar con respecto al orden de los elementos en el código. Por ejemplo, no coloque inicializadores estáticos a la mitad o en la parte inferior del código y tampoco tenga varios de ellos extendiéndose sobre la clase. Simplemente ponga uno en la parte superior, después de las declaraciones estáticas.


bloques static no son difíciles de leer. Así que recomendaría esa solución. Sin embargo, puede ajustar su objeto en otro objeto, por ejemplo ObjectNameWrapper que comparte una interface con su ObjectName , y cuyo constructor llama a su constructor ObjectName , ocultando todas las excepciones marcadas que se producen. Pero de nuevo, elegiría la opción estática.