2009-05-16 20 views
30

¿Cuál es la diferencia en Java entre una clase de utilidad (una clase con métodos estáticos) y una clase de servicio (una clase con métodos públicos que proporciona un "servicio"). Por ejemplo, se puede argumentar que un objeto criptográfico (que proporciona métodos para cifrar, descifrar, calcular o obtener un valor de sal) es un proveedor de servicios, pero muchos agrupan esta funcionalidad en una clase de utilidad con métodos estáticos, como CryptoUtil.encrypt (.. .). Estoy tratando de descubrir qué camino sigue mejor "diseño". ¿Pensamientos?Java Utility Class vs. Service

Respuesta

19

diferentes comportamientos se pueden obtener mediante el uso de diferentes objetos de servicio. Los métodos estáticos en una clase de utilidad no se pueden intercambiar. Esto es extremadamente útil para probar, cambiar implementaciones y otros propósitos. Por ejemplo, usted menciona un CryptoUtil con un método encrypt. Sería extremadamente útil tener diferentes objetos que podrían soportar diferentes estrategias de cifrado, diferentes destinatarios de mensajes, etc.

7

La diferencia es que las clases de servicio pueden tener estado. Y por estado me refiero al estado conversacional. Considere un sistema de ordenamiento nocional.

interface OrderSystem { 
    void login(String username, String password); 
    List<Item> search(String criteria); 
    void order(Item item); 
    void order(Item item, int quantity); 
    void update(Item item, int quantity); 
    void remove(Item item); 
    void checkout(); 
    Map<Item, Integer> getCart(); 
    void logout(); 
} 

Tal cosa podría hacerse con beans de sesión con estado (como un ejemplo), aunque en el caso de que la autenticación probablemente estaría cubierto mecanismos EJB más tradicionales.

El punto aquí es que hay un estado conversacional en el sentido de que los resultados de una llamada afectan las llamadas subsiguientes. Puede ver los métodos estáticos como un conjunto de servicios simples sin estado que se ejecutan localmente.

Un servicio tiene un significado mucho más amplio que incluye, pero no se limita a, ser:

  • de estado;
  • remoto; y
  • depende de la implementación (es decir, a través de una interfaz).

Mejor práctica, creo que es simplemente utilizar métodos estáticos como métodos de conveniencia (especialmente dada la falta de métodos de extensión de Java). Los servicios son mucho más ricos que eso.

+1

Una variable estática conservará el estado de una clase estática. No es que esté fomentando las clases estáticas, solo digo ... –

+2

La mayoría de las clases que he visto con estado estático son ejemplos de lo que llamo el patrón 'Ojalá fuera un singleton'. –

+0

El estado estático en una clase estática es una de las mejores formas que conozco (si no es la mejor) para entrar en el sorprendente mundo de los problemas de simultaneidad. Sólo digo'... –

0

Creo que no existen reglas estrictas.

Normalmente utilizo métodos estáticos para la funcionalidad que requiere pocos parámetros, y se puede lograr en una sola llamada a un método. Ejemplo:

  • calcular un valor hash de una cadena
  • convertir una fecha a la representación estándar

Si una funcionalidad requiere muchos parámetros, y si hay varios resultados relacionados que se crean, entonces es más práctico tener un classe que pueda aceptar los parámetros compartidos en su constructor, con varios métodos que realizan la acción real.

Ejemplo típico: una conexión de base de datos, que se conecta por primera vez, a continuación, utilizar para hacer una consulta, a continuación, utilizar para obtener el resultado ...

0

He respondido esta pregunta aquí en algún lugar anteriormente, pero lo que encontré fue que era muy fácil cambiar el comportamiento de un Servicio - refactorizarlo en múltiples servicios - donde se necesita un refactor bastante significativo si usa un clase estática

Si esa es la única diferencia (y creo que lo es), entonces no tiene sentido usar clases estáticas.

Cada vez que alguien dice "Nunca habrá más de 1 de estos", código para n de ellos.

3

No puede anular el método estático, lo que puede ser un gran problema en caso de que desee implementar su servicio de dos maneras diferentes y cambiar entre ellas. Por esta razón, limitaría el uso de clases de utilidad estática a cosas simples que "nunca" (con un valor suficientemente largo de "nunca" :)) deben realizarse de más de una manera.