web-dev-qa-db-ja.com

ユーティリティクラスコンストラクタを非表示にする:ユーティリティクラスには、パブリックコンストラクタまたはデフォルトコンストラクタを含めることはできません

ソナーでこの警告が表示されています。ソナーでこの警告を削除するソリューションが必要です。私のクラスはこのようなものです:

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

ソナーでこの警告を削除する適切なソリューションが必要です。

82
Oomph Fortuity

このクラスがユーティリティクラスのみの場合、クラスをfinalにしてプライベートコンストラクターを定義する必要があります。

public final class FilePathHelper {

   private FilePathHelper() {
      //not called
   }
}

これにより、デフォルトのパラメーターなしのコンストラクターがコードの他の場所で使用されるのを防ぎます。さらに、サブクラスで拡張できないようにクラスを最終クラスにすることができます。これはユーティリティクラスのベストプラクティスです。プライベートコンストラクターのみを宣言したため、他のクラスではそれを拡張することはできませんが、クラスをfinalとしてマークすることをお勧めします。

154

Sonarはわかりませんが、プライベートコンストラクターを探しているのではないかと思います。

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

それ以外の場合、Javaコンパイラはパブリックなパラメータなしのコンストラクタを提供しますが、これは本当に必要ありません。

(また、最終的なものにする必要がありますが、他のクラスはプライベートコンストラクターしか持たないため、とにかく拡張することはできません。)

18
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