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.
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.
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é.)
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.
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.");
}
Ajouter un constructeur privé:
private FilePathHelper(){
super();
}
Rend la classe utilitaire finale et ajoute un constructeur privé
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.