wake-up-neo.com

Dienstklassenkonstruktor ausblenden: Dienstprogrammklassen sollten keinen öffentlichen oder Standardkonstruktor enthalten

Ich erhalte diese Warnung auf Sonar. Ich möchte eine Lösung, um diese Warnung auf Sonar zu entfernen .. __ Meine Klasse sieht so aus:

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;       
    }
}

ich möchte eine geeignete Lösung, um diese Warnung vom Sonar zu entfernen.

69
Oomph Fortuity

Wenn diese Klasse nur eine Utility-Klasse ist, sollten Sie die Klasse als final definieren und einen privaten Konstruktor definieren:

public final class FilePathHelper {

   private FilePathHelper() {
      //not called
   }
}

Dadurch wird verhindert, dass der standardmäßige Konstruktor ohne Parameter an anderer Stelle in Ihrem Code verwendet wird. Darüber hinaus können Sie die Klasse als final definieren, sodass sie nicht in Unterklassen erweitert werden kann. Dies ist eine bewährte Methode für Dienstprogrammklassen. Da Sie nur einen privaten Konstruktor deklariert haben, können ihn andere Klassen ohnehin nicht erweitern. Es ist jedoch eine bewährte Methode, die Klasse als endgültig zu kennzeichnen.

140

Ich kenne Sonar nicht, aber ich vermute, dass es einen privaten Konstruktor sucht:

private FilePathHelper() {
    // No-op; won't be called
}

Andernfalls stellt der Java-Compiler einen öffentlichen parameterlosen Konstruktor bereit, den Sie wirklich nicht möchten.

(Sie sollten es auch final machen, obwohl andere Klassen es sowieso nicht erweitern könnten, da es nur einen privaten Konstruktor gibt.)

17
Jon Skeet

Ich benutze eine Aufzählung ohne Instanzen

public enum MyUtils { 
    ; // no instances
    // class is final and the constructor is private

    public static int myUtilityMethod(int x) {
        return x * x;
    }
}

sie können dies mit aufrufen

int y = MyUtils.myUtilityMethod(5); // returns 25.
11
Peter Lawrey

Die beste Methode ist, einen Fehler auszulösen, wenn die Klasse erstellt wird. 

Beispiel:

/**
 * 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.");
}
9
javaPlease42
public class LmsEmpWfhUtils {    
    private LmsEmpWfhUtils() 
    { 
    // prevents access default paramater-less constructor
    }
}

Dadurch wird verhindert, dass der standardmäßige Konstruktor ohne Parameter an anderer Stelle in Ihrem Code verwendet wird. 

0
Rinku Gohel