web-dev-qa-db-ja.com

ダガーシングルトンvs Kotlinオブジェクト

シングルトンを定義するには、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 objects もできます。それでも、オプション2が優先されると思いますか?

16
Mahozad

オプション2を使用してください。

ソフトウェアエンジニアリングでは、シングルトンパターンは、クラスのインスタンス化を1つの「単一」インスタンスに制限するソフトウェア設計パターンです。これは、システム全体でアクションを調整するために1つのオブジェクトが必要な場合に役立ちます。

From: シングルトンパターン

したがって、シングルトンはスコープ内の単一のインスタンスです。 Androidの場合は、アプリを実行している仮想マシンインスタンスです。カスタムスコープが必要な場合は、オプション2のみを使用する必要があります。

ただし、オブジェクト内に静的メソッドしかない場合は、それらをグローバルメソッドとして保持し、objectを削除することをお勧めします。何も注入する必要はありません。これは、静的メソッドのみを含むJavaクラスに似ています(ユーティリティクラスを作成する通常の方法であるため、この点について説明しました)。

ただし、objectにも状態がある場合。短剣で行くことをお勧めします。 object方法は、依存性注入を提供しません。シングルトンを作成するだけです。 daggerを使用する目的は、依存性注入です。

0
Embydextrous