Carga de propiedades de configuración de XML -- java campo con xml campo con properties campo con configuration camp codereview Relacionados El problema

Loading configuration properties from XML


3
vote

problema

Español

Me gustaría una revisión de la transformación del primer método al actualizado a continuación:

  else3  

Parece que es GC'd, así que no hay fugas de memoria. ¿Y no está utilizando un else4 en el archivo FileHandle realmente un problema?

  else5  
Original en ingles

I would like a review of the transformation of the first method to the updated one below:

 private static ArrayList<String> getValuesfromXML(String key1, String key2) {     ArrayList<String> valueArray = new ArrayList<String>();     try {          String scriptPath = getScriptPath("prop.xml");         File file = new File(scriptPath);         FileInputStream fileInput = new FileInputStream(file);         Properties properties = new Properties();         properties.loadFromXML(fileInput);         fileInput.close();         valueArray.add(properties.getProperty(key1));         valueArray.add(properties.getProperty(key2));      } catch (FileNotFoundException e) {         e.printStackTrace();     } catch (IOException e) {         e.printStackTrace();     }      return valueArray; } 

It looks as if it's GC'd so there's no memory leaks. And is not using a finally on the filehandle really an issue?

    /**      * read property values from the configuration file. Using standard Java Properties class.      *      * @param key1      *            - Property key      * @param key2      *            - Property Key      * @return - ArrayList values of properties based on keys      */      private static ArrayList<String> getPropertyValue (String key1, String key2){          final ArrayList<String> valueArray = new ArrayList<>();         String scriptPath = getScriptPath(propertiesFileName);          try (FileInputStream fileInput = new FileInputStream(scriptPath)) {             Properties properties = new Properties();             properties.loadFromXML(fileInput);             valueArray.add(properties.getProperty(key1));             valueArray.add(properties.getProperty(key2));          } catch (Exception  ex) {             ex.printStackTrace();         }          return valueList;     } 
           
 
 

Lista de respuestas

4
 
vote
vote
La mejor respuesta
 

Tu conversión es bastante buena. Haría algunas sugerencias, pero en general "pasaría" una revisión de código, dependiendo del código que llama a esta función (sí, eso hace una diferencia). Si tuviera que sugerir cambios serían ...

Interfaces sobre clases de concreto.

Utilice interfaces en lugar de tipos de concreto para valores de retorno y parámetros. En su caso, su función devuelve ArrayList<String> , pero convertiría eso a List<String> . Sin embargo, esto puede no ser posible sin cambiar otro código en su sistema. Eso también implicaría cambiar la variable final ArrayList<String> valueArray para ser final List<String> valueArray .

Manejo de errores

Su manejo chupa ... Pero si está bloqueado en la firma de la función debido a otro código, entonces no puede hacer mucho para cambiarlo, fácilmente. Sin embargo, la impresión de la traza de la pila es una solución de hombre muy pobre.

Tenga en cuenta que puede Use un multi -Excepción captura ahora, y haz:

  } catch (IOException | FileNotFoundException e) {     // ... handle e }   

Uso java.nio.file.*

Las nuevas funciones de NIO normalmente son más eficientes, así que usándolas cuando puedas.

en su caso, yo tendría:

  Path script = Paths.get(getScriptPath(propertiesFileName)); try (InputStream input = new BufferedInputStream(Files.newInputStream(scritpt))) {     // ..... } catch (.....) {     // ..... }   

Tenga en cuenta que el input es un 9988777665544338 y no un 9988777665544339 ... use la forma más alta de la instancia donde pueda. < / p>

Declarar variables donde se usan ...

Declara la variable de resultados List<String>0 fuera del bloque de prueba. Esto se debe a cómo realiza el manejo de errores y es posible que desee devolverlo cuando tenga un valor vacío. Esta no es la mejor solución, sin embargo, tendría:

  List<String>1  

El finalmente ....

Está usando un List<String>2 en el mango de archivo Cerrar ... eso es lo que hace el intento con-recursos por usted.

 

Your conversion is pretty good. I would make some suggestions but on the whole it would "pass" a code review - depending on the code that's calling this function (yes, that does make a difference). If I was to suggest changes they would be...

Interfaces over concrete classes.

Use interfaces instead of concrete types for return values and parameters. In your case, your function returns ArrayList<String>, but I would convert that to List<String>. This may not be possible without changing other code in your system, though. That would also imply changing the variable final ArrayList<String> valueArray to be final List<String> valueArray.

Error Handling

Your handling sucks.... but if you're locked in to the function signature because of other code, then you can't do much to change it, easily. Still, printing the stack trace is a very poor-man's solution.

Note that you can use a multi-exception catch now, and do:

} catch (IOException | FileNotFoundException e) {     // ... handle e } 

Use java.nio.file.*

The newer NIO functions typically are more efficient, so use them when you can.

In your case, I would have:

Path script = Paths.get(getScriptPath(propertiesFileName)); try (InputStream input = new BufferedInputStream(Files.newInputStream(scritpt))) {     // ..... } catch (.....) {     // ..... } 

Note that the input is an InputStream and not a FileInputStream ... use the highest form of the instance where you can.

Declare variables where they are used....

You declare the result variable valueArray outside the try-block. This is because of how you do the error handling and you may want to return it when it has an empty value. This is not the best solution though, I would have:

try (InputStream input = new BufferedInputStream(Files.newInputStream(scritpt))) {     // .... get properties     List<String> valueArray = new ArrayList<>();     // .... populate it....     return valueArray; } catch (....) {     // ... report the error     e.printStackTrace();     // ... return an empty array.     return Collections.emptyList(); } 

The finally....

You are using a finally on the file handle close... that's what the try-with-resources does for you.

 
 

Relacionados problema

7  Concepto de configuración e implementación  ( Configuration concept and implementation ) 
He creado una API para cargar, guardar y leer la configuración del usuario en mi solicitud. Tengo una interfaz 9988777665544330 que proporciona los métodos ...

2  Configuración del sitio de carga desde el archivo INI  ( Loading site configuration from ini file ) 
Me carga en la configuración estática a través de un archivo INI. El archivo INI tiene los beneficios de no ser servidor por la mayoría de los servidores w...

8  Administración de la configuración de la aplicación de Python en un almacén de valor clave  ( Managing python application configuration in a key value store ) 
Para un proyecto en el que estamos trabajando, necesitamos un lugar central para almacenar las configuraciones para varias aplicaciones (son todos los servici...

9  Almacenamiento de la configuración de una aplicación de rubí  ( Storing a ruby apps settings ) 
He usado código que se parece un poco como esto en una aplicación, estoy trabajando en: module App module Settings class << self attr_accessor...

2  libconfini (biblioteca compartida)  ( Libconfini shared library ) 
Recientemente escribí una pequeña biblioteca de análisis INI. El código también está en GitHub , con documentación . Me gustaría tener opiniones, sugerencia...

75  Obtener / configurar valores predeterminados de mi aplicación.config  ( Getting setting default values from my app config ) 
Imagina que necesito una paleta de colores para mi aplicación de formas de WinForm Tener una apariencia consistente. Lo que hice fue crear una clase de ayud...

3  Inicialización de propiedades numéricas de un archivo de propiedades basadas en texto  ( Initialising numerical properties from a text based properties file ) 
Este es un instantáneo de datos de DataSource basado en el marco de primavera que lee sus propiedades del contexto marco de resorte, es decir, los valores son...

3  Configuración de un convertidor de divisas para obtener feeds de tipo de cambio para varias monedas  ( Configuring a currency converter to get exchange rate feeds for for multiple cur ) 
Estoy tratando de hacer que mi función sea más versátil al eliminar los datos codificados duros. function get_currency_rate($currencySource) { if (isset($...

6  Configuración de NGINX, con valores predeterminados y soporte globales para un sitio PHP  ( Nginx configuration with global defaults and support for a php site ) 
El siguiente código es un archivo confes de NGINX predeterminado. El archivo CONF en sí incluye otro bloque 99887766655443312 que posee la configuración de ...

4  Analizar un archivo de texto que contiene configuraciones para el software Neuroimaging  ( Parse a text file containing settings for neuroimaging software ) 
Me gustaría refactar un gran método de Python que escribí para tener mejores prácticas. Escribí un método que analiza un archivo de diseño de la biblioteca ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos