注意: 以下、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()
前述の問題はバッキングフィールド持たないプロパティにサービスを代入する場合は発生しませんが、サービスを取得する場合はプロパティを使用するのではなく、明示的な getInstance() メソッドを使用することが推奨されます。
MyApplicationService.getInstance() 呼び出しを Kotlin と Java の両方で使用する場合に一貫性が保たれます。MyApplicationService.getInstance() と MyProjectService.getInstance(project) の一貫性が保たれます。ツールのパフォーマンスを向上させるため、明示的なメソッドの戻り値の型を維持することを常にお勧めします。
例:
@Service
class MyApplicationService {
companion object {
@JvmStatic
val instance: MyApplicationService // 不適切
get() = service()
}
}
@Service
class MyApplicationService {
companion object {
@JvmStatic
fun getInstance(): MyApplicationService = service() // 適切
}
}
2023.3 の新機能です