123

ソナーでこの警告が表示されます。SonarQubeでこの警告を削除するソリューションが必要です。

私のクラスはこんな感じです:

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

ソナーでこの警告を削除するための適切な解決策が必要です。

4

11 に答える 11

222

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

public final class FilePathHelper {
   private FilePathHelper() {
      //not called
   }
}

これにより、デフォルトのパラメーターなしのコンストラクターがコードの他の場所で使用されるのを防ぎます。

さらに、クラスをfinalにして、サブクラスで拡張できないようにすることができます。これは、ユーティリティクラスのベストプラクティスです。プライベートコンストラクターのみを宣言したため、他のクラスはそれを拡張できませんが、クラスをfinalとしてマークすることをお勧めします。

于 2013-01-18T12:16:05.950 に答える
21

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

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

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

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

于 2013-01-18T12:15:57.323 に答える
12

インスタンスのない列挙型を使用します

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.
于 2013-01-18T12:37:55.430 に答える
10

ベストプラクティスは、クラスが構築されている場合にエラーをスローすることです。

例:

/**
 * 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.");
}
于 2015-01-15T18:35:07.957 に答える
7

Lombokアノテーションを使用するだけで、不要な初期化を回避できます。

以下のように使用@NoArgsConstructorするAccessLevel.PRIVATE

@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class FilePathHelper {
   // your code 
}
于 2020-06-16T12:35:18.150 に答える
1

Sonarでこのルールを無効にすることをお勧めします。プライベートコンストラクターを導入するメリットはありません。コードベースに冗長な文字を追加するだけで、他の人が読み取る必要があり、コンピューターで保存して処理する必要があります。

于 2020-04-21T19:40:45.023 に答える
0

Lombokを使用する別の方法は、@UtilityClass注釈を使用することです。

@UtilityClassロンボクで実験的な機能として導入されましたv1.16.2

クラスに。という注釈が付けられている場合@UtilityClass、次のことが起こります。

  • ファイナルとマークされています。
  • その中でコンストラクターが宣言されている場合、エラーが生成されます。
    • それ以外の場合は、プライベートの引数なしコンストラクター生成されます。をスローしUnsupportedOperationExceptionます。
  • クラス内のすべてのメソッド、内部クラス、およびフィールドにはマークが付けられてい staticます。

概要:

ユーティリティクラスは、関数の単なる名前空間であるクラスです。そのインスタンスは存在できず、そのすべてのメンバーは静的です。たとえば、java.lang.Mathおよびjava.util.Collectionsはよく知られているユーティリティクラスです。

このアノテーションは、アノテーションが付けられたクラスを自動的に1つに変換します。

ユーティリティクラスをインスタンス化することはできません。

クラスをでマークすることにより@UtilityClasslombokは、例外をスローするプライベートコンストラクターを自動的に生成し、追加した明示的なコンストラクターにエラーのフラグを付け、クラスをfinalとしてマークします。

クラスが内部クラスの場合、そのクラスもstaticとマークされます。

ユーティリティクラスのすべてのメンバーは、自動的に静的としてマークされます。フィールドや内部クラスですら。

例:

import lombok.experimental.UtilityClass;

@UtilityClass
public class FilePathHelper {

    private static String resourcesPath;

    public static String getFilePath(HttpServletRequest request) {
        if(resourcesPath == null) {
            ServletContext context = request.getSession().getServletContext();
            String serverpath = context.getRealPath("");               
            resourcesPath = serverpath + "/WEB-INF/classes/";   
        }
        return resourcesPath;       
    }
}

公式ドキュメントからの参照:

于 2022-02-17T23:36:49.090 に答える
-1

プライベートコンストラクターを追加します。

private FilePathHelper(){
    super();
}
于 2016-05-04T04:59:20.080 に答える
-1
public class LmsEmpWfhUtils {    
    private LmsEmpWfhUtils() 
    { 
    // prevents access default paramater-less constructor
    }
}

これにより、デフォルトのパラメーターなしのコンストラクターがコードの他の場所で使用されるのを防ぎます。

于 2018-05-24T06:40:13.160 に答える
-1

SonarQubeのドキュメントstaticでは、クラス宣言にキーワードを追加することを推奨しています。

つまり、に変更public class FilePathHelperpublic static class FilePathHelperます。

または、プライベートまたは保護されたコンストラクターを追加することもできます。

public class FilePathHelper
{
    // private or protected constructor
    // because all public fields and methods are static
    private FilePathHelper() {
    }
}
于 2018-12-17T18:01:47.040 に答える
-3

ユーティリティクラスをfinalにし、プライベートコンストラクタを追加します

于 2018-04-19T00:05:27.030 に答える