Ocultar Constructor de clase de utilidad: Las clases de utilidad no deben tener un constructor público o predeterminado
Estoy recibiendo esta advertencia en el Sonar.Quiero solución para eliminar esta advertencia en sonar. Mi clase es así :
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;
}
}
Quiero una solución adecuada para eliminar esta advertencia en el sonar.
7 answers
Si esta clase es solo una clase de utilidad, debe hacer que la clase sea final y definir un constructor privado:
public final class FilePathHelper {
private FilePathHelper() {
//not called
}
}
Esto evita que el constructor sin parámetros predeterminado se use en otro lugar de su código. Además, puede hacer que la clase sea final, de modo que no se pueda extender en subclases, lo que es una práctica recomendada para las clases de utilidad. Dado que declaraste solo un constructor privado, otras clases no podrían extenderlo de todos modos, pero sigue siendo una buena práctica marcar la clase como final.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-08-16 04:21:46
No lo sé Sonar, pero sospecho que está buscando un constructor privado:
private FilePathHelper() {
// No-op; won't be called
}
De lo contrario, el compilador Java proporcionará un constructor público sin parámetros, que realmente no desea.
(También debería hacerlo definitivo, aunque otras clases no podrían extenderlo de todos modos debido a que solo tiene un constructor privado.)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-01-18 12:15:57
Uso una enumeración sin instancias
public enum MyUtils {
; // no instances
// class is final and the constructor is private
public static int myUtilityMethod(int x) {
return x * x;
}
}
Puede llamar a esto usando
int y = MyUtils.myUtilityMethod(5); // returns 25.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-26 13:09:01
La mejor práctica es lanzar un error si la clase está construida.
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.");
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-01-15 18:35:07
Agregar constructor privado:
private FilePathHelper(){
super();
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-04 08:40:37
Hacer la clase de utilidad final y añadir un constructor privado
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-19 00:05:27
public class LmsEmpWfhUtils {
private LmsEmpWfhUtils()
{
// prevents access default paramater-less constructor
}
}
Esto evita que el constructor sin parámetros predeterminado se use en otro lugar de su código.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-05-24 06:49:23