kotlin项目实战总结

kotlin项目实战总结

公司新项目采用kotlin完成,也算是对前段时间kotlin的学习的实战,这里记录总结一下kotlin的优缺点,
即与java的不同,还有从java项目转到kotlin会碰到的疑惑。

Kotlin Android Extensions插件使用需要注意的问题

Kotlin Android Extensions是简化view初始化的插件,秉承着拿来就用的原则,我也就不讲原理了,讲一下过程中会
碰到的问题

在activity当中的使用

这个应该是最没有问题的,直接在activity中导出view就可以了

import kotlinx.android.synthetic.main.activity_main.*
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    welcomeMessage.text = "Hello Kotlin!"
}

在fragment当中的使用

在fragment中使用可能会出现空指针问题,对view的调用必须放在onCreateView之后,我自己是在onViewCreated
里面对view进行初始化,不能再onCreated里面进行初始化,会报空指针异常。

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, null)
        init(savedInstanceState)
    }

在adapter跟自定义View当中的使用

这里没什么特别的,导出方式记住就行了import kotlinx.android.synthetic.main.layout_name.view.*

import kotlinx.android.synthetic.main.item_homepate_vertical_template.view.*
 override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        return when(viewType){
            TemplateItemType.VERTICAL_TEMPLATE.value,TemplateItemType.NULL_PLACEHOLDER_VERTICAL_TEMPLATE.value -> {
                BaseViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.item_homepate_vertical_template, null, false))
            }

        }
    }
holder.itemView.tv_title.text = "title"

JAVA工具类

我们在java项目中都会有很多静态方法的工具类,然后我们通过as自动转化之后会发现转成了object类,
看上去像是满足了需求,不过后来我自己使用kotlin自带的一些工具类,我发现都是使用inline方式,这两者是有区别的,

object是一个单例

inline是一个内联函数

使用单例需要创建对象且调用函数是需要进栈出栈的,需要消耗更多性能,而
使用inline会将函数编译成方法体,不需要创建对象跟调用函数

内联可能导致生成的代码增加;不过如果我们使用得当(即避免内联过大函数),性能上会有所提升,尤其是在循环中的“超多态(megamorphic)”调用处。

NULL问题

kotlin号称可避免null指针问题,其实在我看来也只是减少而已,因为我们在项目开发过程中
很多空指针都是因为后台返回的数据问题,把一些不应该等于null的字段弄成了null,以致于
在写java项目的时候会有大量的 != null的检测代码,然后换成kotlin也是一样的,你原本
以为这个字段是val,但是后台就偏偏给你返回一个null,不好意思,这个时候null指针又来了,
你就只能乖乖的弄成var可null?,然后像下面这样去使用

 scene?.let { 
      it.use()
 }                      

唯一的好处就是定义成?之后,编译器在使用到字段的地方都会提醒你做null值检测,也是变相减少null指针吧

get/set方法问题

跟据java的编码风格,我们可能会这么写

var isSelectHandAnim: Boolean = false
        set(value) {
            isSelectHandAnim = value
            invalidate()
        }

这段代码会使得循环调用,最终ANR,正确的写法应该是

var isSelectHandAnim: Boolean = false
        set(value) {
            field = value
            invalidate()
        }

扩展函数

扩展函数个人认为还是蛮不错的,我们一般数据类会写成如下形式

data class ElementNumData(val id: Int, val count: Int)

当这个类需要自定义方法时,可以定义扩展函数,就不会影响数据类的简洁性了

data class ElementNumData(val id: Int, val count: Int)

fun ElementNumData.use(){

}

个人见识比较浅薄,也就只能分享这些了

你可能感兴趣的:(移动开发)