Я прочитал из 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 клиент, как второй код, так, какова цель объекта-компаньона тогда?