Masquer le constructeur de classe D'utilité: les classes D'utilité 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 ceci :

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 sonar.

60
demandé sur buræquete 2013-01-18 16:14:49

7 réponses

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. De plus, vous pouvez rendre la classe finale, de sorte qu'elle ne puisse pas être étendue dans les sous-classes, ce qui est une bonne pratique pour les classes utilitaires. Puisque vous avez déclaré seulement un constructeur privé, d'autres classes ne seraient pas en mesure de l'étendre de toute façon, mais c'est toujours une meilleure pratique à marquer la classe finale.

128
répondu RoflcoptrException 2015-08-16 04:21:46

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

17
répondu Jon Skeet 2013-01-18 12:15:57

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.
9
répondu Peter Lawrey 2016-02-26 13:09:01

La meilleure pratique consiste à lancer 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.");
}
8
répondu javaPlease42 2015-01-15 18:35:07

Ajouter un constructeur privé:

private FilePathHelper(){
    super();
}
0
répondu chethan s j 2016-05-04 08:40:37

Rend la classe utilitaire finale et ajoute un constructeur privé

0
répondu Amit Agrawal 2018-04-19 00:05:27
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
répondu Rinku Gohel 2018-05-24 06:49:23