公司新项目采用kotlin完成,也算是对前段时间kotlin的学习的实战,这里记录总结一下kotlin的优缺点,
即与java的不同,还有从java项目转到kotlin会碰到的疑惑。
Kotlin Android Extensions是简化view初始化的插件,秉承着拿来就用的原则,我也就不讲原理了,讲一下过程中会
碰到的问题
这个应该是最没有问题的,直接在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中使用可能会出现空指针问题,对view的调用必须放在onCreateView
之后,我自己是在onViewCreated
里面对view进行初始化,不能再onCreated里面进行初始化,会报空指针异常。
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, null)
init(savedInstanceState)
}
这里没什么特别的,导出方式记住就行了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项目中都会有很多静态方法的工具类,然后我们通过as自动转化之后会发现转成了object
类,
看上去像是满足了需求,不过后来我自己使用kotlin自带的一些工具类,我发现都是使用inline
方式,这两者是有区别的,
object
是一个单例
inline
是一个内联函数
使用单例需要创建对象且调用函数是需要进栈出栈的,需要消耗更多性能,而
使用inline会将函数编译成方法体,不需要创建对象跟调用函数
内联可能导致生成的代码增加;不过如果我们使用得当(即避免内联过大函数),性能上会有所提升,尤其是在循环中的“超多态(megamorphic)”调用处。
kotlin号称可避免null指针问题,其实在我看来也只是减少而已,因为我们在项目开发过程中
很多空指针都是因为后台返回的数据问题,把一些不应该等于null的字段弄成了null,以致于
在写java项目的时候会有大量的 != null
的检测代码,然后换成kotlin也是一样的,你原本
以为这个字段是val,但是后台就偏偏给你返回一个null,不好意思,这个时候null
指针又来了,
你就只能乖乖的弄成var可null?,然后像下面这样去使用
scene?.let {
it.use()
}
唯一的好处就是定义成?之后,编译器在使用到字段的地方都会提醒你做null值检测,也是变相减少null指针吧
跟据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(){
}
个人见识比较浅薄,也就只能分享这些了