在 Kotlin 中将数据类属性作为参数传递到函数中,无需冗余

问题描述 投票:0回答:1

我有一个代表用户设置的数据类:

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 中的属性的情况下处理此问题?

kotlin parameter-passing object-destructuring
1个回答
0
投票

其他人在评论中提出了一些解决方案和疑问。一种解决方案是将数据类参数设置为

var

现在在

SettingsRepository
中您可以执行以下操作:

companion object {
    inline fun buildRequest(request: UpdateSettingsRequest.() -> Unit): UpdateSettingsRequest {
        return UpdateSettingsRequest().apply(request)
    }
}

之后您应该可以拨打:

repo.updateSettings(SettingsRepository.buildRequest {
    isNotificationsOn = false
})

请注意,在某些情况下,设置参数

var
可能并不理想。

© www.soinside.com 2019 - 2024. All rights reserved.