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.
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.
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é.)
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 à 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.");
}
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.