Скрыть конструктор класса Utility: классы Utility не должны иметь открытый или стандартный конструктор - программирование
Подтвердить что ты не робот

Скрыть конструктор класса Utility: классы Utility не должны иметь открытый или стандартный конструктор

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

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

Я хочу правильное решение для удаления этого предупреждения на гидролокаторе.

4b9b3361

Ответ 1

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

public final class FilePathHelper {

   private FilePathHelper() {
      //not called
   }
}

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

Ответ 2

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

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

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

(Вы также должны сделать его окончательным, хотя другие классы не смогут его продлить, поскольку он имеет только частный конструктор.)

Ответ 3

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

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.

Ответ 4

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

Пример:

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

Ответ 5

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

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

Ответ 6

Перечисления могут быть использованы в качестве классов Utility. Это избавляет от ошибок Sonar, Checkstyle и PMD. Я ограничиваю свое использование экземпляров без экземпляров основными классами. Я не хочу использовать enum просто, чтобы обойти это правило.

Кроме того, что вы делаете с документацией Java, которая генерирует и отображает все эти классы Utility в виде перечислений? Это может вводить в заблуждение и трудно понять.

Разве JDK не может обеспечить подобный перечислению класс для этих определенных служебных классов? По сути, нам нужен класс, который работает точно так же, как enum, является окончательным и не требует предоставления частного конструктора.

Ответ 7

Добавить частный конструктор:

private FilePathHelper(){
    super();
}

Ответ 8

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

Ответ 9

Документация SonarQube рекомендует добавлять static ключевое слово в объявление класса.

То есть измените public class FilePathHelper на public static class FilePathHelper.

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

public class FilePathHelper
{
    // private or protected constructor
    // because all public fields and methods are static
    private FilePathHelper() {
    }
}