ソナーでこの警告が表示されています。ソナーでこの警告を削除するソリューションが必要です。私のクラスはこのようなものです:
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;
}
}
ソナーでこの警告を削除する適切なソリューションが必要です。
このクラスがユーティリティクラスのみの場合、クラスをfinalにしてプライベートコンストラクターを定義する必要があります。
public final class FilePathHelper {
private FilePathHelper() {
//not called
}
}
これにより、デフォルトのパラメーターなしのコンストラクターがコードの他の場所で使用されるのを防ぎます。さらに、サブクラスで拡張できないようにクラスを最終クラスにすることができます。これはユーティリティクラスのベストプラクティスです。プライベートコンストラクターのみを宣言したため、他のクラスではそれを拡張することはできませんが、クラスをfinalとしてマークすることをお勧めします。
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.");
}
public class LmsEmpWfhUtils {
private LmsEmpWfhUtils()
{
// prevents access default paramater-less constructor
}
}
これにより、デフォルトのパラメーターなしのコンストラクターがコードの他の場所で使用されるのを防ぎます。