it 参数会混淆。解决办法就是像下面如许显示的声明:
- list.forEach { item ->
- item.split(".").forEach { part ->
- println(part)
- }
- }
看起来是不是很多多少了!
隐蔽的复制
留意不雅察下面的类:
- data class Foo(val bars: MutableList)
data 类供给了一系列的办法,并且你可以经由过程拷贝获得其镜像。猜猜下面的代码会输出什么?
- val bars = mutableListOf("foobar", "wombar")
- val foo0 = Foo(bars)
- val foo1 = foo0.copy()
- bars.add("oops")
- println(foo1.bars.joinToString())
控制台会输出 foobar, wombar, oops。问题出在 copy 办法并没有真正地复制一个完全的对象, 而是复制了对象的引用。当你忘记编写单位测试类,并且将你的 data 类按照弗成变类来传递的时刻,就可能出现这种问题。
解决办法就是当你应用 data 类的时刻必定要多加当心,并且当你必须将其作为值对象的时刻,像下面如许:
- data class Foo(val bars: List)
- data 类还有一个问题:其 equals / hashCode 办法所用到的属性弗成变。你只能经由过程手工重写这些办法的方法来修改返回值。谨记膳绫擎这一点。
内部办法裸露
这种情况下,你应用了可能返回 null 值的 peek 办法。然则 Kotlin 编译器不会提示你这个问题,所以当你的 Queue 是空队列的的时刻,可能会触发 NullPointerException 异常。
细心思虑下面的例子:
- class MyApi {
- fun operation0() {
- }
- internal fun hiddenOperation() {
- }
- }
Kotlin 供给了 JDK 集合类的弗成变版本。
每个跳转到你的办法的人都邑不知所措。所以我认为在你编写如许的办法之前务必三思。下面就是一个建议:
在 Kotlin 傍边,你可以不消推敲在你的代码中若何处理 null 的问题,这会让你忘记 null 是无处不在的┞封个说法,只不过被隐蔽了起来。看看下面这个外面看起来没有问题的类:
当你在 Kotlin 的项目中引用这个类的时刻,internal 关键字是生效的。然则当你年腋荷琐 Java 项目中应用的时刻,hiddenOperation 就变成了一个公共办法!为了避免这种情况,我建议应用接口的方法来隐蔽实现的细节:
问题在于我们应用的 Queue 是 JDK 的一个接口,并且当你查看 peek 办法的文档瓯:
- interface MyApi {
- fun operation0()
- }
- class MyApiImpl: MyApi {
- override fun operation0() {
- }
- internal fun hiddenOperation() {
- }
- }
特别的全局扩大
毫无疑问,扩大函数的功能异常重要。但平日,才能越大年夜义务越大年夜。例如,你可以编写全局的 JDK 类扩大函数。然则当这个函数只在本地高低文中有意义,倒是全局可见的时刻,就会带来很多麻烦。
- fun String.extractCustomerName() : String {
推荐阅读
2017 年 Python 使用情况报告,你用 2.x 还是 3.x?
沙龙晃荡 | 去哪儿、陌陌、ThoughtWorks在主动化运维中的实践!10.28不见不散!纵不雅各大年夜编程说话在 2017 年的成长情况,我们会发明 Python 的成长速度异常快。Semaphore 社区查询拜访了 Python 在>>>详细阅读
本文标题:如何避免Kotlin里的陷阱?
地址:http://www.17bianji.com/lsqh/38070.html
1/2 1