2011-09-01 13 views
27

Diciamo che ho una classe di utilità DateUtil (vedi sotto). Per utilizzare questo metodo, , un metodo chiamante utilizza DateUtils.getDateAsString (aDate). Sarebbe meglio rimuovere il modificatore statico e rendere DateUtil un bean spring (vedi DateUtilsBean) e iniettarlo nelle classi di chiamata o lasciarlo così com'è?Classe di utilità nell'applicazione Spring - dovrei usare metodi statici o no?

Uno svantaggio che posso vedere con l'utilizzo di statica è edizioni intorno beffardo, vedere 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; 
    } 
} 

Primavera Bean versione

@Component 
public class DateUtilsBean { 

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

risposta

21

Io non la penso così. Una classe DateUtils suona come una pura classe di utilità che non ha effetti collaterali, ma elabora solo i parametri di input. Questo tipo di funzionalità può anche rimanere in un metodo statico. Non penso sia molto probabile che tu voglia prendere in giro metodi di aiuto per la data.

+6

concordato. Solo perché tutto ciò che è necessario essere cablato come un fagiolo di primavera non significa che tutto dovrebbe essere collegato come un fagiolo di primavera. –

+2

Cosa succede se il metodo statico legge un file di configurazione che guida la mia applicazione? è probabile che voglia prendere in giro questo comportamento. Pensaci: vuoi fare test funzionali ma non vuoi diventare una "fabbrica di configurazione". se fosse un singleton allora posso più facilmente deridere quel metodo e guidare il mio test dal codice. Tuttavia, con PowerMock è possibile simulare anche metodi statici. – uthomas

+4

Potrebbe essere un over-engineering, ma renderlo un bean che può essere iniettato rende più semplice il test unitario delle classi dipendenti. Renderebbe ancora più semplice testare se avesse implementato un'interfaccia. – Behrang

4

Sarebbe meglio dichiararlo come un bean Spring perché il suo ciclo di vita è quindi gestito da Spring, e alla fine si possono iniettare dipendenze, riunire l'oggetto, così come testarlo in modo corretto, non parla che potresti usarlo come oggetto regolare e passarlo come parametro, ridefinire il metodo in sottoclassi ... ecc.

In breve, sì, sarebbe un design migliore nella maggior parte dei casi. Tuttavia, in un caso semplice come l'esposto, non fa una grande differenza.

4

Sono d'accordo con Sean Patrick Floyd.

Questo è il mio criterio: se i metodi della classe eseguono operazioni solo sui parametri che ricevono, senza dipendenze esterne (database, file system, configurazione utente, altri oggetti/bean, ecc.), Farei con metodi statici, solitamente in una classe finale con un costruttore privato.

Altrimenti, lo implementerei usando un fagiolo di primavera.

Quindi, nel caso in cui si alzi, secondo questo criterio, scriverei una classe con metodi statici.

Saluti.

Problemi correlati