Qual è la differenza in Java tra una classe di utilità (una classe con metodi statici) e una classe di servizio (una classe con metodi pubblici che fornisce un "servizio"). Ad esempio, si può sostenere che un oggetto crittografico (che fornisce metodi per crittografare, decifrare, hash o ottenere un valore salt) è un fornitore di servizi, ma molti raggruppano questa funzionalità in una classe di utilità con metodi statici, come CryptoUtil.encrypt (.. .). Sto cercando di capire da che parte segue meglio "design". Pensieri?Java Utility Class vs. Service
risposta
diversi comportamenti possono essere ottenuti utilizzando diversi oggetti del servizio. I metodi statici in una classe di utilità non possono essere scambiati. Questo è estremamente utile per testare, cambiare implementazioni e altri scopi.
Ad esempio, si parla di un CryptoUtil
con un metodo encrypt
. Sarebbe estremamente utile avere oggetti diversi che potrebbero supportare diverse strategie di crittografia, diversi destinatari di messaggi, ecc.
La differenza è che le classi di servizio potrebbero avere lo stato. E per stato intendo lo stato di conversazione. Si consideri un sistema di ordinamento teorico.
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();
}
Una cosa del genere potrebbe essere fatto con i fagioli di sessione stateful (come un esempio), anche se in quel caso l'autenticazione probabilmente essere coperto meccanismi EJB più tradizionali.
Il punto qui è che vi è uno stato di conversazione in quanto i risultati di una chiamata influiscono sulle chiamate successive. È possibile visualizzare i metodi statici come una serie di semplici servizi stateless eseguiti localmente.
Un servizio ha un significato molto più ampio che include, ma non è limitato a, essere:
- stateful;
- remoto; e
- dipendente dall'implementazione (cioè tramite un'interfaccia).
Le migliori pratiche penso sia semplicemente utilizzare metodi statici come metodi di convenienza (soprattutto data la mancanza di metodi di estensione di Java). I servizi sono molto più ricchi di così.
Penso che non ci siano regole dure e veloci.
In genere utilizzo metodi statici per funzionalità che richiedono pochi parametri e possono essere eseguiti in una singola chiamata di metodo. Esempio:
- calcolare un valore hash per una stringa
- convertire una data di rappresentazione standard
Se una funzionalità richiede molti parametri, e se ci sono diversi risultati correlate venga creato, quindi è più pratico per avere una classe in grado di accettare i parametri condivisi nel suo costruttore, con diversi metodi che eseguono l'azione reale.
Esempio tipico: una connessione al database, che prima connessione, quindi utilizzare per fare una query, quindi utilizzare per ottenere il risultato ...
Ho risposto a questa domanda qui da qualche parte prima, ma quello che ho trovato è stato che è stato molto facile cambiare il comportamento di un servizio - rifattarlo in più servizi - dove ci vuole un refactoring piuttosto significativo se si utilizza un classe statica.
Se questa è l'unica differenza (e credo che lo sia), non ha mai senso utilizzare classi statiche.
Ogni volta che qualcuno dice "Non ci sarà mai più di 1 di questi", codice per n di essi.
Non è possibile sovrascrivere il metodo statico, che può essere un grosso problema nel caso in cui si desideri implementare il servizio in due modi diversi e passare da uno all'altro. Per questo motivo, limiterei l'uso di classi di utilità statiche a cose semplici che "mai" (per un valore sufficientemente lungo di "mai" :)) devono essere eseguite in più di un modo.
- 1. Service vs. Repository
- 2. Class # isinstance vs Class # isAssignableFrom
- 3. utility per generare XSD dalla classe java
- 4. Access grailsApplication o Service in groovy class
- 5. AngularJS: controller vs service
- 6. BroadcastReceiver vs Service
- 7. Swift: Protocollo vs. Struct vs. Class
- 8. Static Class vs Singleton
- 9. @class vs #import
- 10. Nullable struct vs class
- 11. confrontare repository vs provider vs service
- 12. Azure WebApi vs Azure Mobile Service vs
- 13. Riferimento Web vs Service Reference
- 14. nServiceBus vs Mass Transit vs Rhino Service Bus vs altro?
- 15. C/C++ Struct vs Class
- 16. class() vs. type() in Ruby
- 17. Attributi Python Class vs. Module
- 18. Assemblies vs Class Libraries (.NET)
- 19. java static class/variables
- 20. Eager java class loading
- 21. Class() vs self .__ class __() durante la creazione dell'oggetto?
- 22. chiama Restful Service from Java
- 23. Java Message Service e Haskell
- 24. Android: quando utilizzare Service vs Singleton?
- 25. API API RESTful vs Web Service
- 26. Quando utilizzare Dependency injection vs service locator
- 27. Windows Service vs Windows Application - Best Practice
- 28. Service Bus Brokered VS Relayed Messaging
- 29. Topshelf vs sc.exe vs Windows Service tipo di progetto
- 30. differenza tra java bean e java class?
Una variabile statica conserva lo stato per una classe statica. Non che io stia incoraggiando le classi statiche - sto solo dicendo ... –
La maggior parte delle classi che ho visto con stato statico sono esempi di quello che io chiamo il modello "Vorrei essere un singleton". –
Lo stato statico in una classe statica è uno dei modi migliori che conosco (se non il migliore) per entrare nel fantastico mondo dei problemi di concorrenza. Dì solo ... –