web-dev-qa-db-fra.com

Classe utilitaire dans l'application Spring - dois-je utiliser des méthodes statiques ou non?

Disons que j'ai une classe d'utilité DateUtil (voir ci-dessous). Pour utiliser cette méthode, une méthode d'appelant utilise DateUtils.getDateAsString (aDate). Serait-il préférable de supprimer le modificateur statique et de faire de DateUtil un bean de printemps (voir DateUtilsBean) et de l'injecter dans les classes appelantes ou de le laisser tel quel?

Un inconvénient que je peux voir avec l'utilisation de la statique est les problèmes de moquerie, voir Comment se moquer des méthodes statiques?

public class DateUtils {

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

Version Spring Bean

@Component
public class DateUtilsBean {

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

Je ne pense pas. Une classe DateUtils ressemble à une classe utilitaire pure qui n'a aucun effet secondaire mais traite uniquement les paramètres d'entrée. Ce type de fonctionnalité peut également rester dans une méthode statique. Je ne pense pas qu'il soit très probable que vous souhaitiez vous moquer des méthodes d'assistance de date.

29
Sean Patrick Floyd

Je suis d'accord avec Sean Patrick Floyd.

C'est mon critère: si les méthodes de la classe ne font que des choses sur les paramètres qu'elles reçoivent, sans dépendances externes (base de données, système de fichiers, configuration utilisateur, autres objets/beans, etc.), je le ferais avec des méthodes statiques , généralement dans une classe finale avec un constructeur privé.

Sinon, je l'implémenterais en utilisant un bean Spring.

Donc, dans le cas où vous élevez, selon ce critère, j'écrirais une classe avec des méthodes statiques.

Cordialement.

13
Alberthoven

Il serait préférable de le déclarer en tant que bean Spring, car son cycle de vie est ensuite géré par Spring, et vous pouvez éventuellement injecter des dépendances, regrouper l'objet, ainsi que le tester correctement, sans parler de ce que vous pourriez l'utiliser comme un objet régulier et le passer en paramètre, redéfinir la méthode en sous-classes ... etc.

En bref, oui, ce serait une meilleure conception dans la plupart des cas. Néanmoins, dans un cas aussi simple que celui exposé, cela ne fait pas une grande différence.

9
Mr.Eddart