¿Cuál es la mejor manera de inicializar un miembro estático complejo en Java?

Mi objetivo es tener un Propertiesobjeto estático privado en mi clase, para actuar como valores predeterminados al crear otros Propertiesobjetos necesarios para mi aplicación. La implementación actual se ve así:

public class MyClass {
    private static Properties DEFAULT_PROPERTIES = new Properties();

    static {
        try {
           DEFAULT_PROPERTIES.load(
               MyClass.class.getResourceAsStream("myclass.properties"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
 }

Mirándolo, funciona, pero no se siente bien.

¿Como lo harias?

Respuesta 1

Básicamente hay dos formas. La primera forma es usar el bloque estático como lo ha mostrado (pero luego con un en ExceptionInInitializerErrorlugar del RuntimeException). La segunda forma es usar un método estático al que llama inmediatamente en la declaración:

private static Properties DEFAULT_PROPERTIES = getDefaultProperties();

private static Properties getDefaultProperties() {
    Properties properties = new Properties();
    try {
        properties.load(MyClass.class.getResourceAsStream("myclass.properties"));
    } catch (IOException e) {
        throw new ConfigurationException("Cannot load properties file", e);
    }
    return properties;
}

El ConfigurationExceptionpuede ser su clase personalizada que se extiende RuntimeException.

Personalmente prefiero el staticbloque porque no tiene sentido tener un método que se ejecuta solo una vez en su vida. Pero si refactoriza el método para que tome un nombre de archivo y pueda reutilizarse globalmente, entonces sería más preferido.

private static Properties DEFAULT_PROPERTIES = SomeUtil.getProperties("myclass.properties");

// Put this in a SomeUtil class.
public static Properties getProperties(String filename) {
    Properties properties = new Properties();
    try {
        properties.load(Thread.currentThread().getContextClassLoader().getResourceAsStream(filename));
    } catch (IOException e) {
        throw new ConfigurationException("Cannot load " + filename, e);
    }
    return properties;
}
Respuesta: 2

Quiero obtener el valor de la base de datos, en mi caso uso List para obtener el valor de la base de datos, pero recibí este error Exception en el hilo "main" java.lang.ClassCastException: [Ljava.lang.Object; ...

¿Hay alguna forma más eficiente que la que estoy usando actualmente para fusionar dos archivos línea por línea agregando la línea del archivo2 al archivo1? Si el archivo1 contiene a1 b1 c1 Y el archivo2 contiene a2 b2 c2 Entonces el ...

Estoy tratando de implementar la codificación MP3 en Android usando la biblioteca LAME siguiendo estas guías: Lame MP3 Encoder compile para Android http: //developer.samsung.com/android/technical-docs/Porting-and -...

Tengo un método privado genérico que realiza tareas comunes y es utilizado por otros métodos. El método genérico tiene condiciones if y else para admitir otros métodos que se llaman. Ejemplo: vacío privado ...