シングルトンを定義するには、Kotlinオブジェクト宣言を使用する必要がありますか、それとも通常のKotlinクラスを作成し、短剣を使用して注入する必要がありますか?私の意見では、最初のオプションは間違いなく簡単ですが、この状況で短剣を使用する理由が私にはわかりません。
オプション1(通知object
キーワード):
object SomeUtil {
// object state (properties)
fun someFunction(number: Long) {
// ...
}
}
オプション2(class
キーワードに注意):
class SomeUtil {
// object state (properties)
fun someFunction(number: Long) {
// ...
}
}
@Module
class AppModule {
@Provides
@Singleton
internal fun provideTheUtil() = SomeUtil()
}
class MainActivity : BaseActivity() {
@Inject internal lateinit var util: SomeUtil
}
UPDATE 2019-07-03
@Blackbeltはコメントで、テスト容易性のためにオプション2を選ぶべきだと述べました。しかし、MockKのようなライブラリは mock object
s もできます。それでも、オプション2が優先されると思いますか?
オプション2を使用してください。
ソフトウェアエンジニアリングでは、シングルトンパターンは、クラスのインスタンス化を1つの「単一」インスタンスに制限するソフトウェア設計パターンです。これは、システム全体でアクションを調整するために1つのオブジェクトが必要な場合に役立ちます。
From: シングルトンパターン
したがって、シングルトンはスコープ内の単一のインスタンスです。 Androidの場合は、アプリを実行している仮想マシンインスタンスです。カスタムスコープが必要な場合は、オプション2のみを使用する必要があります。
ただし、オブジェクト内に静的メソッドしかない場合は、それらをグローバルメソッドとして保持し、object
を削除することをお勧めします。何も注入する必要はありません。これは、静的メソッドのみを含むJavaクラスに似ています(ユーティリティクラスを作成する通常の方法であるため、この点について説明しました)。
ただし、object
にも状態がある場合。短剣で行くことをお勧めします。 object
方法は、依存性注入を提供しません。シングルトンを作成するだけです。 daggerを使用する目的は、依存性注入です。