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
相关产品推荐
相关产品推荐

