加入收藏 | 设为首页 | 会员中心 | 我要投稿 宿州站长网 (https://www.0557zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

如何防止Kotlin里的陷阱?

发布时间:2021-12-07 16:02:33 所属栏目:教程 来源:互联网
导读:最近 Kotlin 特别流行,并且我也赞同 Kotlin 是一个经过深思熟虑后被设计出的语言,除了下面提到的缺点之外。我会在本文向你分析一些我在开发过程中遇到的陷阱,并且教你如何避免他们。 谜一样的 null 在 Kotlin 当中,你可以不用考虑在你的代码中如何处理 n

    }
})
问题关键点在于只有 Java 支持 SAM 转换,Kotlin 并不支持。我的建议是简单的场景中,只是用 Java 的 SAM 接口作为一个消费者:
 
fun consumeText(text: String, fn: Consumer<String>) {
}
// usage from Kotlin
consumeText("foo", Consumer {
    println(it)
})
// usage from Java
consumeText("foo", System.out::println);
Java 中使用不可变集合
Kotlin 提供了 JDK 集合类的不可变版本。
 
fun createSet(): Set<String> = setOf("foo")
// ...
createSet().add("bar") // oops, compile error
这是一个很好的补充。但是当你在看 Java JDK 的 Set 类 API 的时候会发现:
 
createSet().add("bar"); // UnsupportedOperationException
当你尝试修改这个 Set 的时候,就会抛出这个异常,就像你使用了Collections.unmodifiableSet() 方法一样。我不知道这种情况是否合理,但是你在使用 Kotlin 不可变版本的 Java 集合类的时候,需要谨记这一点。
 
接口中没有重载
Kotlin 在接口上不支持使用 @JvmOverloads 注解,当然 override 也不行。
 
interface Foo {
    @JvmOverloads // OUCH!
    fun bar(qux: String)
}
class FooImpl : Foo {
 
    @JvmOverloads // YIKES!
    override fun bar(qux: String) {
    }
}
你只能像下面这样手动定义:
 
interface Foo {
    fun bar()
    fun bar(qux: String)
}
要记住你可以使用 Kotlin 中的 KEEP (Kotlin Evolution and Enhancement Process) 来改善。KEEP 与 Java 中的 JEP 类似,但是与 JEP 相比要简洁许多。
 
总结
Kotlin 现下很流行,并且我也认为他是一个增强版的 Java。但是在使用 Kotlin 的时候你仍需要保持清醒,尤其是当你身处各种各样的关于 Kotlin 的宣传之中时。如果你要使用 Kotlin 的话,一定要注意我们在上面提到的 Kotlin 相关的缺陷。
 
最后我还是想说,上述提到的问题都比较容易解决,并且不会对语言的使用方面带来本质性的伤害。

(编辑:宿州站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

推荐文章