今天给大家总结一下,Kotlin在项目中踩过的坑;
首先看,我们在Koltin项目中都踩过哪些坑
1. Kotlin没有配置直接使用
第一次创建Kotlin Activity,会提示 Kotlin not configured,我们直接点configure,如图:
然后点 Android with Gradle
之后进入Kotlin配置界面,默认点 ok 即可
这样也就配置完成了。这里我没有按照这个思路方法实现。我觉得这种方便是方便,配置好之后点击sync同步一下就OK了。
2. 集合List不能addAll()
在下拉刷新的时候,我将新得来的数据添加到之前的数据集合中,但是addAll()不让用,最终查资料才知道是因为List集合中没有这个方法,Are you kidding me???
原来在Kotlin中,明确的区分了可变和只读的集合(list, set, map等),明确的确定了集合的可读性,有助于良好的编码,以及便于Bug的规避。
MutableList:
MutableList<E>接口继承于List<E>,MutableCollection<E>,是对只读集合的扩展,增加了了对集合的添加及删除元素的操作。直接上代码,后面皆是代码截图
修改:
但是在交流过程中发现这样也可是实现
还有一个是arrayListOf(),这个也能实现
这是为什么呢?咱们一点一点的看,先看下MutableList的源码:
这里MutableList继承了List, MutableCollection,里面重写了很多的方法。这里说的很详细,我觉得有java基础的都能看懂,这里只提供一个思路---看源码。
再看下arrayListOf的源码:
这里使用 inline 内联函数Java中的ArrayList()函数,就是目标代码的增加为代价来换取时间的节省。内联函数又是什么呢?为什么会有内联函数呢?
调用某个函数实际上将程序执行顺序转移到该函数所存放在内存中某个地址,将函数的程序内容执行完后,再返回到转去执行该函数前的地方。这种转移操作要求在转去前要保护现场并记忆执行的地址,转回后先要恢复现场,并按原来保存地址继续执行。也就是通常说的压栈和出栈。因此,函数调用要有一定的时间和空间方面的开销。那么对于那些函数体代码不是很大,又频繁调用的函数来说,这个时间和空间的消耗会很大。
那怎么解决这个性能消耗问题呢,这个时候需要引入内联函数了。内联函数就是在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来直接进行替换。显然,这样就不会产生转去转回的问题,但是由于在编译时将函数体中的代码被替代到程序中,因此会增加目标程序代码量,进而增加空间开销,而在时间代销上不象函数调用时那么大,可见它是以目标代码的增加为代价来换取时间的节省。
listOf
listOf()是使用ArrayList实现的,返回的list是只读的,其内存效率更高。在开发过程中,可以尽可能的多用只读List,可以在一定程度上提高内存效率。
已经成为源码狂魔的你肯定还想再看listOf()的源码:
看注释很明白,这里返回一个只读的空集合且实现了序列化。咱们接着看emptyList()的源码:
这就已经浮出水面了,emptyList()是List类型。咱们接着看EmptyList的源码:
到这里我们就看出来了ListOf()中所有的方法。
3. 运算符号报错
这里 - 报错,这怎么会出错?对于刚用于项目中的我也是一脸懵逼。原来使Kotlin的非空机制导致的。因为你的mList?.size加了一个问号所以有可能返回null
怎么处理这个呢,很简单,直接加上!!,注意是两个
为什么呢?!!操作符,抛出一个非空的B 或者空KNPE(KotlinNullPointerException)。
这里会抛出KotlinNullPointerException这个异常。因为咱们的mList是null。有人说这么多操作符看着别扭,怎么才能不那么多的操作符呢?
其他的还需要小伙伴们自己发掘。