static final フィールド/イミュータブルプロパティへのアプリケーションサービスの代入を報告します。

Static final フィールド (Java) またはバッキングフィールドを持つ static イミュータブルプロパティ (Kotlin)

注意: 以下、Kotlin での static とは匿名でないオブジェクトまたはトップレベル宣言のメンバーを指します。

このようなサービスの代入はグローバルの状態に影響を及ぼし、テストでアプリケーションを削除して別のアプリケーションをセットアップできなくなるため、同じプロセスで繰り返されるテストが失敗する可能性があります。 唯一の例外は、ダミー/デフォルトインスタンスへの明示的なコンストラクターの呼び出しです。

サービスの代入を回避するには、サービスをローカルで取得することをお勧めします。 代わりに java.util.function.Supplier (Java, Kotlin) で囲むか、 プロパティを関数に変換することもできます (Kotlin)。

例 (Java):


// 不適切:
private static final ManagingFS ourInstance = ApplicationManager.getApplication().getService(ManagingFS.class);

// 適切:
private static final Supplier<ManagingFS> ourInstance = CachedSingletonsRegistry.lazy(() -> {
  return ApplicationManager.getApplication().getService(ManagingFS.class);
});

// 例外
private static final UniqueVFilePathBuilder DUMMY_BUILDER = new UniqueVFilePathBuilder()

static イミュータブルプロパティを介したサービスインスタンスの取得 (Kotlin)

前述の問題はバッキングフィールド持たないプロパティにサービスを代入する場合は発生しませんが、サービスを取得する場合はプロパティを使用するのではなく、明示的な getInstance() メソッドを使用することが推奨されます。

ツールのパフォーマンスを向上させるため、明示的なメソッドの戻り値の型を維持することを常にお勧めします。

例:


@Service
class MyApplicationService {
  companion object {
    @JvmStatic
    val instance: MyApplicationService // 不適切
       get() = service()
  }
}

@Service
class MyApplicationService {
  companion object {
    @JvmStatic
    fun getInstance(): MyApplicationService = service() // 適切
  }
}

2023.3 の新機能です