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.

Author: buræquete, 2013-01-18

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.

 128
Author: RoflcoptrException,
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.)

 17
Author: Jon Skeet,
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.
 9
Author: Peter Lawrey,
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.");
}
 8
Author: javaPlease42,
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();
}
 0
Author: chethan s j,
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

 0
Author: Amit Agrawal,
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.

 0
Author: Rinku Gohel,
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