「随手记」不要再用java开发安卓了, Kotlin不香吗( 二 )


那么Kotlin就不恶心了:
也许这就是程序员追求的优雅!Kotlin通过“?.”的语法实现空对象的判断 , 如果操作的对象为空 , 语句就不会执行“?.”后面的语句 , 直接返回null 。
在实际的情景中 , 经常性的我可能会多次使用判断后的对象 , 类似写成这样:
这里多次使用data.getAlbum().getSongs().get(0)这个代表的对象 , 整个代码看起来是十分糟糕了 。
那有些人也会加个临时变量:
加了临时变量 , 看起来是好多了 , 如果在方法里 , 有多个类似的情况 , 临时变量也会变多 。 更多的临时变量 , 肯定也会越不直观 。
现在我用Kotlin这么写:
Kotlin通过let函数 , 使得用一个it代替判断后的对象 , 在这里即为data.getAlbum().getSongs().get(0)
在方法块里 , 就可以用it代表判断后的对象了 。
当然 , 如果连it也不想写 , 可以用apply函数 , apply函数可以使得在方法块里 , 改变this的指向 , 把它指向了判断后的对象 , 我也经常这么用:
【「随手记」不要再用java开发安卓了, Kotlin不香吗】干净多了是不是 。
第三痛、 简单的Java对象不简洁
在安卓的开发中 , 我在传参或者从服务器获取数据后 , 会使用一些简单的类代表这里数据 , 这些类只有一些属性及其getter setter方法的类没有业务逻辑 。
通常如下:
我们从一开始编程的时候 , 就被别人说 , 不要直接操作这些类的属性 , 而应该通过setget方法来访问 。
基于这一原则 , 我们编写了大量的setget样例代码 。 在实际的使用中 , 这些简单的类会特别多 , 某些类的属性的个数也会相当可观 , 在代码阅读和维护上 , 越来越多样例代码 。
这个原则 , 在网页开发中 , 也可以见到 。 如在vue.js开发中(这时跟java是有一点不同的 , 即访问时不通过方法) , 使用状态管理vuex , 访问某个状态 , 可以直接引用 , 当改变某个状态时 , 通过方法修改 。 如:
访问时这样写:store.state.count
修改时:store.commit('increment')
那么 , 现在用kotlin呢 , 难道不用这么麻烦了?
确实好用了 , 笔者在第一次使用的时候就惊呆了 , 通过data class关键字 , set、get操作被内置为语法实现的一部分 , 从此再也不会写set、get了 。
当然 , 有些人可能不同意了:“你这个说得不对 。 java的 lombok插件它不香吗?”
嗯 , lombok确实可以 , 但在团队开发 , 你装上这个 , 导致全团队的人也要统一安装 。 额外的安装一个插件 , 代价不低 。
最后一痛:findViewById的恶梦 。
当然 , 这不是java的问题 。 在安卓中 , 你要操作布局的某个元素 , 你就得先通过findViewById获取对应的元素 , 再操作它 。 而在实际的开发中 , 布局的元素是非常多的 , 每个都写上一遍 , 你要跟我一样要发疯 。 例如 , 如果布局上有这么一个id为message的文本组件 , 那么我可能会这么操作它:
findViewById这样的代码能写到想吐 。 是时候优化了 。
好了 , 我想又有人要抬我的杠了:“大哥 , 可以用ButterKnife , 就不用findView了呀 。 ”
个人觉得然并卵 。 butterknife在fragment上的使用跟activity还有差别 , 容易出错 。 更何况 , 这些都不如用
Kotlin来写:
方便吧 , 直接使用 。
在工作中 , 你可能因为一些项目的历史原因 , 并没有办法切换到Kotlin , 或者又觉得学习一门新的语言太累了 , 学不动了 。 但就我经验 , Kotlin的学习成本不高 , 而相应的回报 , 也就是开发的效率 , 确实大大提高 。
安卓开发日新月异 , 稍微不学习就会落后 , 作为安卓开发 , 往后可能就是flutter的天下了 , 到时候就是“不要再用Kotlin开发安卓了 , flutter不香吗” 。


推荐阅读