web-dev-qa-db-fra.com

Masquer le constructeur de la classe d'utilitaires: les classes d'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 . 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 la solution appropriée pour supprimer cet avertissement sur sonar.

69
Oomph Fortuity

Si cette classe est uniquement 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. De plus, vous pouvez rendre la classe finale afin qu'elle ne puisse pas être étendue dans des sous-classes, ce qui est une pratique recommandée pour les classes utilitaires. Puisque vous avez déclaré uniquement un constructeur privé, les autres classes ne seraient pas en mesure de l'étendre de toute façon, mais il est toujours recommandé de marquer la classe en tant que finale.

140
RoflcoptrException

Je ne connais pas Sonar, mais je suspecte qu'il recherche 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 le rendre final, bien que les autres classes ne soient pas en mesure de l'étendre de toute façon car il n'a qu'un constructeur privé.)

17
Jon Skeet

J'utilise une énumération 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 appeler cela en utilisant

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

La meilleure pratique consiste à générer une erreur si la classe est construite. 

Exemple:

/**
 * 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.");
}
9
javaPlease42
public class LmsEmpWfhUtils {    
    private LmsEmpWfhUtils() 
    { 
    // prevents access default paramater-less constructor
    }
}

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

0
Rinku Gohel