126 votes

Masquer le constructeur des classes utilitaires : Les classes utilitaires ne doivent pas avoir de constructeur public ou par défaut.

Je reçois cet avertissement sur Sonar. Je veux une solution pour supprimer cet avertissement sur Sonar Qube.

Ma classe est comme ça :

public class FilePathHelper {
    private static String resourcesPath;
    public static String getFilePath(HttpServletRequest request) {
        if(resourcesPath == null) {
            String serverpath = request.getSession().getServletContext().getRealPath("");               
            resourcesPath = serverpath + "/WEB-INF/classes/";   
        }
        return resourcesPath;       
    }
}

Je veux une solution appropriée pour supprimer cet avertissement sur le sonar.

228voto

RoflcoptrException Points 22111

Si cette classe n'est qu'une classe utilitaire, vous devez rendre la classe finale et définir un constructeur privé :

public final class FilePathHelper {
   private FilePathHelper() {
      //not called
   }
}

Cela empêche le constructeur sans paramètre par défaut d'être utilisé ailleurs dans votre code.

En outre, vous pouvez rendre la classe finale, afin qu'elle ne puisse pas être étendue dans les sous-classes, ce qui est une bonne pratique pour les classes utilitaires. Puisque vous n'avez déclaré qu'un constructeur privé, les autres classes ne pourront pas l'étendre de toute façon, mais c'est toujours une bonne pratique de marquer la classe comme finale.

21voto

Jon Skeet Points 692016

Je ne connais pas Sonar, mais je pense qu'il cherche un constructeur privé :

private FilePathHelper() {
    // No-op; won't be called
}

Sinon, le compilateur Java fournira un constructeur public sans paramètre, ce que vous ne voulez vraiment pas.

(Vous devriez également rendre la classe finale, bien que d'autres classes ne seraient pas en mesure de l'étendre de toute façon, car elle n'a qu'un constructeur privé).

12voto

Peter Lawrey Points 229686

J'utilise un enum sans instances

public enum MyUtils { 
    ; // no instances
    // class is final and the constructor is private

    public static int myUtilityMethod(int x) {
        return x * x;
    }
}

vous pouvez l'appeler en utilisant

int y = MyUtils.myUtilityMethod(5); // returns 25.

10voto

javaPlease42 Points 842

La meilleure pratique est de lancer une erreur si la classe est construite.

Ejemplo:

/**
 * The Class FooUtilityService.
 */
final class FooUtilityService{

/**
* Instantiates a new FooUtilityService. Private to prevent instantiation
*/
private FooUtilityService() {

    // Throw an exception if this ever *is* called
    throw new AssertionError("Instantiating utility class.");
}

7voto

Roman Topalov Points 71

Vous pouvez simplement utiliser l'annotation Lombok pour éviter toute initialisation inutile.

Utilisation de @NoArgsConstructor con AccessLevel.PRIVATE comme ci-dessous :

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class FilePathHelper {
   // your code 
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X