¿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
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.
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.
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 ...
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.
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.
- 1. Métodos de extensión vs Static Utility Class
- 2. .class vs .java
- 3. WCF Service vs Windows Service
- 4. jQuery core methods vs utility methods
- 5. Service vs. Repository
- 6. Android: AsyncTask vs Service
- 7. BroadcastReceiver vs Service
- 8. ASP.NET Cache class vs. MemoryCache class
- 9. @class vs # import
- 10. Object to Object Mapping Utility
- 11. Ruby: initialize() vs class body?
- 12. Python metaclasses vs class decorators
- 13. nServiceBus vs Mass Transit vs Rhino Service Bus vs otro?
- 14. WCF Service Library contra Class Library tipos de proyecto
- 15. CSS: #id .class VS .class performance. ¿Cual es mejor?
- 16. Eager java class loading
- 17. Java Class File Editor
- 18. Web hosting WAS vs Windows Service
- 19. Android: ¿Cuándo usar Service vs Singleton?
- 20. Service ASP.NET vs capas de repositorio
- 21. MSMQ vs SQL Server Service Broker
- 22. WCF Service vs ASP.NET Web Api
- 23. Mejor REST Client Framework/Utility en Android
- 24. diferencia entre java bean y java class?
- 25. Solution Explorer vs Solution Navigator vs Class View
- 26. ActiveRecord Rails 3 scope vs class method
- 27. Java Client .class File Protection
- 28. java -like friend class mechanism
- 29. Java inner class and inheritance
- 30. IEnumerable vs List in the Response Class, ServiceStack
Una variable estática conservará el estado de una clase estática. No es que esté fomentando las clases estáticas, solo digo ... –
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'. –
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'... –