Скрыть конструктор служебного класса: служебные классы не должны иметь открытого конструктора или конструктора по умолчанию


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

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

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

7 60

7 ответов:

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

public final class FilePathHelper {

   private FilePathHelper() {
      //not called
   }
}

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

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

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

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

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

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

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.

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

пример:

/**
 * 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.");
}

добавить собственный конструктор:

private FilePathHelper(){
    super();
}

сделайте класс утилиты окончательным и добавьте частный конструктор

public class LmsEmpWfhUtils {    
    private LmsEmpWfhUtils() 
    { 
    // prevents access default paramater-less constructor
    }
}

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