it-roy-ru.com

Hide Utility Class Constructor: У служебных классов не должно быть общедоступного или конструктора по умолчанию

Я получаю это предупреждение на сонаре. Я хочу, чтобы решение убрало это предупреждение на сонаре .... Мой класс такой:

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

я хочу правильное решение, чтобы убрать это предупреждение на сонар.

69
Oomph Fortuity

Если этот класс является только служебным классом, вы должны сделать класс final и определить приватный конструктор:

public final class FilePathHelper {

   private FilePathHelper() {
      //not called
   }
}

Это предотвращает использование конструктора по умолчанию без параметров в другом месте вашего кода. Кроме того, вы можете сделать класс финальным, чтобы его нельзя было расширять в подклассах, что является наилучшей практикой для служебных классов. Поскольку вы объявили только приватный конструктор, другие классы все равно не смогут его расширить, но все же рекомендуется помечать класс как финальный.

140
RoflcoptrException

Я не знаю Sonar, но подозреваю, что он ищет частного конструктора:

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

В противном случае компилятор Java предоставит открытый конструктор без параметров, который вам действительно не нужен.

(Вы также должны сделать его окончательным, хотя другие классы не смогли бы его расширить в любом случае из-за наличия только частного конструктора.)

17
Jon Skeet

Я использую перечисление без экземпляров

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

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

вы можете позвонить, используя

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

Лучшая практика - выдавать ошибку, если класс создан. 

Пример:

/**
 * 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
    }
}

Это предотвращает использование конструктора по умолчанию без параметров в другом месте вашего кода. 

0
Rinku Gohel