写在前面:
作为一个安卓客户端的开发人员,现在Android的官方语言已经从java变成了kotlin。java稳稳占据了Android的官方语言长达数十年,而现在谷歌决定改用kotlin自然有它的方便和独到之处。 作为开发人员,还是有必要了解一下kotlin的基础特性和语法的,所以本篇博客就是我个人学习和使用kotlin的心得。
如果同学们看到,能有兴趣了解和学习kotlin,那我这篇博客的目的也就达到啦~
Kotlin的简历:
- 来自于著名的IDE IntelliJ IDEA(Android Studio基于此开发) 软件开发公司 JetBrains(位于东欧捷克)
- 起源来自JetBrains的圣彼得堡团队,名称取自圣彼得堡附近的一个小岛(Kotlin Island)
- 一种基于JVM的静态类型编程语言
来自知名的工具开发商JetBrains,也就决定了Kotlin的基因中必然包含实用与高效等特征。那我们接下来看一看Kotlin的特点,当然这也是我改用Kotlin的重要原因。
1.变量声明:
var a :Int = 1
var b = 1
val str = "string_value"
①可以发现kotlin与java不同的第一点是,变量名前面的类型一律用var和val来标明。其中var(variable)代表变量,其值是可变的,val(value)代表常量,其值不可变。
②kotlin具体的类型可以在变量名后面声明,例如上例中的Int,当然kotlin也支持类型推断,例如var b =1 ,kotlin可以判断出b是整型。这使得kotlin变量的声明更加简洁,节省了敲代码的工作时间。
**
2.函数声明:
**
fun sum(a : Int,b: Int):Int = a + b
①kotlin使用fun关键字定义函数,比较java的不同就是不用考虑返回值是什么,比较简洁。
②kotlin函数参数的定义使用Pascal标记法, 也就是, name: type 的格式,多个参数之间使用逗号分隔,每个参数都必须明确指定类型。
③kotlin的返回类型是在参数定义后面声明的,像例子中的Int就是返回类型。
④如果函数体只有一个表达式的话,可以不用写中括号,直接写表达式,例如直接“= a + b”。甚至如果编译器可以推断出返回值的类型的话,可以不用写返回类型。可以看出kotlin的简洁。
⑤可以看出kotlin语句的末尾不需要加分号,这点有点像python。
fun print(a : String):Unit{
System.out.println(a)
}
该例体现了另一个返回类型,如果没有返回值的话,就使用Unit,相当于void,当然没有返回值的函数可以省略Unit。
注意:函数为多行时,并且返回类型不是Unit,则一定要标明返回类型!
fun <T> asList(vararg ts: T): List<T> {
val result = ArrayList<T>()
for (t in ts) // ts 是一个 Array
result.add(t)
return result
}
该例体现了参数列表为不定长列表的情况,使用的时候可以向参数列表传不定长的参数个数:
val list = asList(1, 2, 3)
另外,kotlin的函数还是有很多其他用法的~这边就不一一陈述了。
**
3.空指针安全:
**
class MainActivity : AppCompatActivity() {
private var startBtn: Button? = null
private var scanView: ScanView? = null
private var myThread: MyThread? = null
private var threadFlag = false
private var scanning = false
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
init()
}
}
这是我截取了我代码里的一部分,来说一下空指针安全。
在说空指针安全之前,有必要说一下kotlin类之间的继承,在java中一般都是extends,在kotlin中比较简洁,直接:就可以了。
空指针(NullPointerException或NPE)是我们使用Java开发程序中最常见的崩溃了。因为在Java中我们不得不写很多防御性的代码,比如这样if(xxx != null){}。然后做一些操作。
在Kotlin中空指针异常得到了很好的解决。
- 在类型上的处理,即在类型后面加上?,即表示这个变量或参数以及返回值可以为null,否则不允许为变量参数赋值为null或者返回null
- 对于一个可能是null的变量或者参数,在调用对象方法或者属性之前,需要加上?,否则编译无法通过。
所以kotlin当调用时,kotlin可以帮我们检测出空指针,从而不再执行!
**
4.支持方法扩展:
**
很多时候,Framework提供给我们的API往往都时比较原子的,调用时需要我们进行组合处理,因为就会产生了一些Util类,一个简单的例子,我们想要更快捷的展示Toast信息,在Java中我们可以这样做。
public static void longToast(Context context, String message) {
Toast.makeText(context, message, Toast.LENGTH_LONG).show();
}
但是Kotlin的实现却让人惊奇,我们只需要重写扩展方法就可以了,比如这个longToast方法扩展到所有的Context对象中,如果不去追根溯源,可能无法区分是Framework提供的还是自行扩展的。
fun Context.longToast(message: String) {
Toast.makeText(this, message, Toast.LENGTH_LONG).show()
}
applicationContext.longToast("hello world")
注意:Kotlin的方法扩展并不是真正修改了对应的类文件,而是在编译器和IDE方面做得处理。使我们看起来像是扩展了方法。
**
5.与Java交互性好:
**
Kotlin和Java都属于基于JVM的编程语言。Kotlin和Java的交互性很好,可以说是无缝连接。这表现在
- Kotlin可以自由的引用Java的代码,反之亦然。
- Kotlin可以现有的全部的Java框架和库
- Java文件可以很轻松的借助IntelliJ的插件转成kotlin
这个特性是非常好的,可以使得已有的项目不用重新大费周章重新全换成kotlin,因为kotlin和java是可以同时存在在一个项目中的,而且java的文件也可以转化成kotlin,例如我用Android studio举个例子。
可以看到AS是支持java文件直接转为kotlin的。
**
6.关于性能:
**
Kotlin的执行效率和Java代码的执行效率理论上一致的。有时候Kotlin可能会显得高一些,比如Kotlin提供了方法的inline设置,可以设置某些高频方法进行inline操作,减少了运行时的进栈出栈和保存状态的开销。
写在结尾:
对于个人的项目来转向Kotlin,通常不是很难的选择,毕竟Kotlin是那么优秀的语言,相信很多人还是愿意尝试并使用这个事半功倍的语言的。
而比较难抉择的情况是如果如何让团队转用Kotlin,个人认为团队难以转用的原因有很多,比如学习成本,历史包袱等等。但其实根本原因还是思维方式的问题,歪果仁喜欢用工具来提升开发效率,因为人力成本很高。而国内团队提高效率的办法通常是增加成员。好在Flipboard 美国团队自2015年(可能更早)就引入了Kotlin,因此中国团队这边选用Kotlin也更加顺水推舟。当然更主要的是目前团队规模不大,成员一致认可Kotlin的优点。
关于团队转用Kotlin的方法,一般比较行得通的办法是自上而下的推行。这就意味着要么直接的技术负责人比较开明要么就是需要有人来不断推介来影响团队。
现在好了,有了Google的支持,Kotlin转Android相信在不久的将来就会全面展开。篡改Python的一句名言“人生苦短,我用Kotlin”,这样一个高效实用的语言应该会被越来越多的团队所接受,并应用到开发生产中。当然也希望在国内环境下大放异彩。