string - 是否有“严格”模式来禁用 Kotlin 中的自动“toString()”调用?
问题描述
我正在将一些非常字符串类型的 Java API 移植到 Kotlin 中。很多字符串有不同的含义,我正在创建更有意义的类型。我以前在 Java 中做过,而且我已经非常讨厌类型的自动“toString”。这么简单的例子:
fun someMethod(protocol: String, host: String) {
val connectionString = "$protocol:$host"
}
协议和主机可以用字符串表示,但是本质上是不同的,所以我介绍一下具体的类型:
class Protocol(val definition:String)
class Host(val definition:String)
然后替换参数定义:
fun someMethod(protocol: Protocol, host: Host) {
val connectionString = "$protocol:$host"
}
现在 connectionString 代码仍然假定这是两个可以连接的字符串。编译器一点也不抱怨,因为它只是在这些类型上调用 toString(),这总是会产生某种字符串,但它很可能类似于 [Host@458ad742]
但我真的很想在这里出现某种类型的错误或警告。过去,我求助于从 toString 中抛出 RuntimeExceptions 来消除这些情况。这太野蛮了,对我来说,编译时错误比运行时错误要好得多。
对我来说,强类型的美妙之处在于在运行之前了解这些问题。
所以:有谁知道编译器标志/分析器/linter/IDE/咒语在编译时找到这些?
解决方案
没有办法将其关闭,您必须重写toString()
才能执行您想要的操作:
class Protocol(val definition:String) {
override fun toString() = definition
}
推荐阅读
- flutter - 从 StreamBuilder 获取有效值
和一个孩子 StreamBuilder - google-sheets - 谷歌应用脚本将多个工作表动态合并到一个主文件中
- ckeditor5 - 样式化 CKEditors 的单个实例的方式?
- amazon-web-services - 一旦它变得健康,有没有办法让 LB 将流量路由到主机?
- c# - 如何使用物理改变子弹射击速度并保持子弹射击距离?
- dryioc - 使用工厂类解析 DryIoc serviceKey 实现
- javascript - 如何获取 JavaScript 以确保没有字段为空
- javascript - 2020 年 Instagram 追随者计数端点
- google-apps-script - 可以从单个 GCP 项目发布多个 Google Apps 脚本编辑器插件吗?
- rust - 使用 multipeek 将 next() 推进到 peek()