Вызывает ли эта модель создания Retrofit утечку памяти? - PullRequest
0 голосов
/ 04 апреля 2020

Я прочитал из Kotlin документации этот сопутствующий объект, поэтому он может иметь только один экземпляр за раз. Вопрос в том, является ли этот шаблон лучшей практикой для создания Retrofit client в Kotlin?

interface MarsApiService {
enum class MarsApiFilter(val value: String) { SHOW_RENT("rent"), SHOW_BUY("buy"), SHOW_ALL("all") }

@GET("realestate")
suspend fun getProperties(@Query("filter") type: String): List<MarsProperty>

// calling MarsApiService.create will return a Retrofit object that implements MarsApiService
companion object {
    private const val BASE_URL = "https://mars.udacity.com/"

    private val logger = HttpLoggingInterceptor()
        .setLevel(BODY)

    private val client = OkHttpClient.Builder()
        .addInterceptor(logger)
        .build()

    private val moshi: Moshi = Moshi.Builder()
        // to make moshi annotations to work probably with kotlin, we add [KotlinJsonAdapterFactory]
        .add(KotlinJsonAdapterFactory())
        .build()

    fun create(): MarsApiService {
        return Retrofit.Builder()
            .client(client)
            .addConverterFactory(MoshiConverterFactory.create(moshi))
            .baseUrl(BASE_URL)
            .build().create(MarsApiService::class.java)
    }
}
}

или я должен сделать объект Instance и инициализировать его только один раз, и если он не нулевой, мы просто возвращаем это как этот код?

@Database(entities = [SleepNight::class], version = 1, exportSchema = false)
abstract class SleepDatabase : RoomDatabase() {

    abstract val sleepDatabaseDao: SleepDatabaseDao

    companion object {

        @Volatile
        private var INSTANCE: SleepDatabase? = null

        fun getInstance(context: Context): SleepDatabase {
            synchronized(this) {
                var instance = INSTANCE

                if (instance == null) {
                    instance = Room.databaseBuilder(
                        context,
                        SleepDatabase::class.java,
                        "sleep_history_database"
                    )
                        .fallbackToDestructiveMigration()
                        .build()
                    INSTANCE = instance
                }
                return instance
            }
        }
    }

}

если я должен создать Retrofit клиент, как второй код, так, какова цель объекта-компаньона тогда?

...