You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kotlin中如何结合Unit与Nothing实现Setter禁用?

Kotlin中禁用setter并结合Nothing类型的解决方案

你想禁用basicauth的setter,将其设为私有并抛出异常,但Kotlin要求setter必须返回Unit,而永远不会正常返回的逻辑通常用Nothing类型标记,这里可以通过以下方式实现两者的结合:

修改后的代码

private val authorization = object {
    val header = "Authorization"
    var granted: Boolean = false
        set(value) {
            field = value
            if (granted)
                preferences.save(username, password)
            else
                recalc_basicauth = true
        }
    var username: String = ""
        set(value) {
            granted = false
            field = value
        }
    var password: String = ""
        set(value) {
            granted = false
            field = value
        }
    private var recalc_basicauth = true
    private val basicauth_prefix = "Basic "
    var basicauth: String = basicauth_prefix
        get() {
            if (recalc_basicauth) {
                field = basicauth_prefix + Base64.getEncoder()
                    .encodeToString("$username:$password".toByteArray())
                recalc_basicauth = false
            }
            return field
        }
        private set(value) {
            throwIllegalArgument("basicauth must not set directly")
        }

    private fun throwIllegalArgument(message: String): Nothing {
        throw IllegalArgumentException(message)
    }
}

关键说明

  • Kotlin语法规定setter方法的返回类型必须是Unit,无法直接声明为Nothing,这是不可更改的规则。
  • 通过在setter内部调用一个返回Nothing的辅助函数,既满足了setter返回Unit的要求,又能让编译器识别出这个setter永远不会正常执行完毕(因为返回Nothing的函数意味着永远不会返回,后续代码不会被执行)。
  • 由于setter已经标记为private,外部代码本来就无法调用,这个异常主要是防止类内部的代码误调用该setter,起到提示和防护的作用。

内容的提问来源于stack exchange,提问作者ceving

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 07:45:51