我有一个代表用户设置的数据类:
data class UpdateSettingsRequest(
val isNotificationsOn: Boolean = true,
val isDarkMode: Boolean = false,
val language: String = "en",
val isAnimationsEnabled: Boolean = true,
)
以及用于更新这些设置的存储库功能:
class SettingsRepository {
fun updateSettings(request: UpdateSettingsRequest) {
makeNetworkRequest(request)
}
private fun makeNetworkRequest(request: UpdateSettingsRequest) {
TODO("make network request to update settings. request = $request")
}
}
目前,我使用这样的存储库:
fun main() {
val repo = getSettingsRepository()
repo.updateSettings(UpdateSettingsRequest(isNotificationsOn = false))
}
但是,我想避免在存储库外部创建
UpdateSettingsRequest
实例,因此我更改了 updateSettings 以接受各个参数:
class SettingsRepository {
fun updateSettings(
isNotificationsOn: Boolean = true,
isDarkMode: Boolean = false,
language: String = "en",
isAnimationsEnabled: Boolean = true,
) {
val request = UpdateSettingsRequest(
isNotificationsOn = isNotificationsOn,
isDarkMode = isDarkMode,
language = language,
isAnimationsEnabled = isAnimationsEnabled,
)
makeNetworkRequest(request)
}
private fun makeNetworkRequest(request: UpdateSettingsRequest) {
TODO("make network request to update settings. request = $request")
}
}
这种方法可以让我更干净地调用函数:
fun main() {
val repo = getSettingsRepository()
repo.updateSettings(isNotificationsOn = false)
}
但是,如果我向
UpdateSettingsRequest
添加新属性,则每次都需要更新 updateSettings,这很容易出错。
问题:Kotlin 中是否有更易于维护的方法,可以让我在不重复 updateSettings 中的属性的情况下处理此问题?
其他人在评论中提出了一些解决方案和疑问。一种解决方案是将数据类参数设置为
var
现在在
SettingsRepository
中您可以执行以下操作:
companion object {
inline fun buildRequest(request: UpdateSettingsRequest.() -> Unit): UpdateSettingsRequest {
return UpdateSettingsRequest().apply(request)
}
}
之后您应该可以拨打:
repo.updateSettings(SettingsRepository.buildRequest {
isNotificationsOn = false
})
请注意,在某些情况下,设置参数
var
可能并不理想。