web-dev-qa-db-fra.com

Comment créer une classe d'utilitaire?

Je veux créer une classe avec des méthodes utilitaires, par exemple

public class Util {

   public static void f (int i) {...}

   public static int g (int i, int j) {...}

}

Quelle est la meilleure méthode pour créer une classe d'utilitaires?

Devrais-je utiliser un constructeur privé?

Devrais-je créer la classe utilitaire pour la classe abstraite?

Devrais-je ne rien faire?

48
user2693979

Pour une classe d’utilitaire complètement sans état en Java, je suggère que la classe soit déclarée public et final, et qu’elle dispose d’un constructeur privé pour empêcher l’instanciation. Le mot clé final empêche le sous-classement et peut améliorer l'efficacité au moment de l'exécution.

La classe devrait contenir toutes les méthodes static et ne devrait pas être déclarée abstract (car cela impliquerait que la classe n'est pas concrète et doit être implémentée d'une manière ou d'une autre).

Un nom doit être attribué à la classe en fonction de son ensemble d’utilitaires fournis (ou "Util" si la classe doit fournir une large gamme d’utilitaires non catégorisés).

La classe ne doit pas contenir de classe imbriquée, à moins que la classe imbriquée soit également une classe utilitaire (bien que cette pratique soit potentiellement complexe et gêne la lisibilité).

Les méthodes de la classe doivent avoir des noms appropriés.

Les méthodes utilisées uniquement par la classe elle-même doivent être privées.

La classe ne doit contenir aucun champ de classe non final/non statique.

La classe peut également être importée de manière statique par d'autres classes pour améliorer la lisibilité du code (cela dépend toutefois de la complexité du projet).

Exemple:

public final class ExampleUtilities {
    // Example Utility method
    public static int foo(int i, int j) {
        int val;

        //Do stuff

        return val;
    }

    // Example Utility method overloaded
    public static float foo(float i, float j) {
        float val;

        //Do stuff

        return val;
    }

    // Example Utility method calling private method
    public static long bar(int p) {
        return hid(p) * hid(p);
    }

    // Example private method
    private static long hid(int i) {
        return i * 2 + 1;
    }
}

Le point le plus important est peut-être que la documentation de chaque méthode devrait être précise et descriptive. Il y a de fortes chances que les méthodes de cette classe soient utilisées très souvent et qu'il soit bon d'avoir une documentation de haute qualité pour compléter le code.

98
initramfs

Selon Joshua Bloch (Effective Java), vous devez utiliser un constructeur privé qui lève toujours une exception. Cela découragera finalement l'utilisateur de créer une instance de la classe util.

L'abrégé sur la classe de marquage n'est pas recommandé car is abstract suggère au lecteur que la classe est conçue pour l'héritage.

13
michaldo

Je ferais la classe final et chaque méthode serait static.

Donc, la classe ne peut pas être étendue et les méthodes peuvent être appelées par Classname.methodName. Si vous ajoutez des membres, assurez-vous qu'ils fonctionnent thread safe;)

8
duffy356

Créer une classe abstract envoie aux lecteurs de votre code un message indiquant que vous voulez que les utilisateurs de votre classe abstract le sous-classent. Cependant, ce n'est pas ce que vous voulez faire alors: une classe utilitaire ne doit pas être sous-classée.

Par conséquent, l'ajout d'un constructeur privé est un meilleur choix ici. Vous devez également faire en sorte que la classe final n'autorise pas le sous-classement de votre classe utilitaire.

5
dasblinkenlight