2011-09-01 6 views
27

Digamos que tengo una clase de utilidad DateUtil (ver a continuación). Para utilizar este método , un método de llamada utiliza DateUtils.getDateAsString (aDate). ¿Sería mejor eliminar el modificador estático y hacer que DateUtil sea un bean de primavera (ver DateUtilsBean) e inyectarlo en las clases llamantes o simplemente dejarlo como está?Clase de utilidad en la aplicación Spring: ¿debo usar métodos estáticos o no?

Una desventaja que puedo ver con el uso de estática es cuestiones en torno de burla, ver How to mock with static methods?

public class DateUtils { 

    public static String getDateAsString(Date date) {  
     String retValue = "" // do something here using date parameter 
     return retValue; 
    } 
} 

de beans Spring versión

@Component 
public class DateUtilsBean { 

    public String getDateAsString(Date date) {  
     String retValue = "" // do something here using date parameter 
     return retValue; 
    } 
} 

Respuesta

21

Yo no lo creo. Una clase DateUtils suena como una clase de utilidad pura que no tiene ningún efecto secundario, solo procesa los parámetros de entrada. Ese tipo de funcionalidad también puede permanecer en un método estático. No creo que sea muy probable que quiera burlarse de los métodos de ayuda de fecha.

+6

De acuerdo. El hecho de que "cualquier cosa" pueda ser cableado como un bean de primavera no significa todo lo que debería estar conectado como un bean de primavera. –

+2

¿Qué sucede si el método estático lee un archivo de configuración que maneja mi aplicación? es probable que quiera burlarme de ese comportamiento. Solo piense en eso: quiere hacer pruebas funcionales pero no quiere convertirse en una "fábrica de configuración". si fuera un singleton, entonces puedo burlarme más fácilmente de ese método y sacar mi prueba del código. Sin embargo, es posible con PowerMock simular también métodos estáticos. – uthomas

+4

Podría ser una sobreingeniería, pero convertirla en un frijol que se puede inyectar hace que resulte más fácil probar las clases dependientes. Sería aún más fácil probar si se hubiera implementado una interfaz. – Behrang

4

Sería mejor declararlo como Spring Bean porque su ciclo de vida es administrado por Spring, y eventualmente puede inyectar dependencias, agrupar el objeto, así como probarlo de manera adecuada, no para Hable que podría usarlo como un objeto regular y pasarlo como parámetro, redefinir el método en subclases ... etc.

En resumen, sí, sería un mejor diseño en la mayoría de los casos. Sin embargo, en un caso tan simple como el expuesto, no hace una gran diferencia.

4

Estoy de acuerdo con Sean Patrick Floyd.

Este es mi criterio: si los métodos de la clase solo hacen cosas sobre los parámetros que reciben, sin dependencias externas (base de datos, sistema de archivos, configuración de usuario, otros objetos/beans, etc.), entonces lo haría con métodos estáticos, generalmente en una clase final con un constructor privado.

De lo contrario, lo implementaría usando un grano de primavera.

Por lo tanto, en el caso de que aumente, de acuerdo con este criterio, escribiría una clase con métodos estáticos.

Atentamente.

Cuestiones relacionadas