Kotlin简介
Kotlin是一种针对Java 平台的新编程语言。Kotlin简洁、安全、务实,并且专注于与Java代码的互操作性。它几乎可以用在现在Java使用的任何地方:服务端开发、Android应用等等。Kotlin 可以很好地和所有现存的Java库和框架一起工作,而且性能和Java旗鼓相当。
- Kotlin 是静态类型语言并支持类型推导,允许维护正确性与性能的同时保持源代码的简洁。
- Kotlin 支持面向对象和函数式两种编程风格,两种风格可以随意混合使用,通过头等函数使更高级别的的抽象成为可能。
- 与Java可互操作,这样可以使学习曲线更平滑,项目新语言更新曲线更平滑。
- Kotlin 是务实的、安全的、简洁的。
被诟病的java空指针
在java问世的时候宣传的一大亮点就是摒弃掉了C语言的指针,了解java的小伙伴都知道java的内存数据结构中,对象存放在堆中而引用存放在栈中,想要获取到对象实体,必须通过引用指向实际的对象内存地址,如果这条联系不在了,那么就会报空指针异常NullPointerException。
kotlin解决了这个问题,不能说是解决,而是有效的限制了这种问题的出现。
- 可用类型(?)新增的一种数据类型,例如:
var value1 : String? = null //是合法的
var value2 : String = null //是不合法的,编译不过的
kotlin编译器认为value2是不可空的String类型,所以初始化和以后的赋值中不能为null,所以一个方法的参数是String类型,如果传入值可能为null,编译器会报错,警告你要传入不可为空的参数。另外:如果和java代码混编的话,可能不会报错,所以还是要注意。
- 安全调用运算符(?.)
这个运算符就厉害了,当你的变量的类型是可空类型,那么在调用内部属性或者方法的时候,必须使用?.运算符,例如:
value1?.length()
这条语句的含义是value1如果为空,则不执行。如果是java代码,会怎么做?
if(value1 != null){
value1.length()
}
代码中不可能所有的对象都要这样去判空一下,那太令人作呕了。有经验的程序员会知道代码执行到这里的时候该对象是否可能为空。但是,上了一些代码异常跟踪平台,比方说bugly,你会发现线上版本在用户手里运行的时候能出现好多无厘头的空指针,完全颠覆你的自信心,所以kotlin真香。
能省则省,要的就是简洁
举例说明一下封装类的创建代码,java代码
public class Person{
private String name;
private int age;
public void setName(String name){
this.name = name;
}
public String getName(){
return name;
}
public void setAge(int age){
this.age = age;
}
public int getAge(){
return age;
}
}
kotlin代码
data class Person(var name: String, var age: Int)
至于get、set方法kotlin代码在编译阶段帮你生成,调用时也不需要get、set,直接对象打点调用属性名称。
高阶函数,回调接口不再是必需品
java代码想要创造一个回调函数,需要创建一个接口:
public interface OnClickListener{
void onClick();
}
需要一个管理类:
public class ListenerManager{
private OnClickListener mOnClickListener;
public void setOnClickListener(OnClickListener onClickListener){
this.mOnClickListener = onClickListener;
}
public OnClickListener getOnClickListener(){
return mOnClickListener;
}
}
需要一个实现类:
public class MyOnClickListener implement OnClickListener{
@Override
public void onClick(){
// 回调函数中处理逻辑
}
}
然后在自己的业务场景中创建MyOnClickListener对象,调用onClick方法,或者通过参数的形式进行异步逻辑实现。
public void getServerData(MyOnClickListener listener){
// 获取到数据之后调用
listener.onClick();
}
obj.getServerData(new MyOnClickListener(){
@Override
public void onClick(){
// 回调函数中处理逻辑
}
})
然而用kotlin的高阶函数可以这么写:
public fun getServerData(listener: ()-> Unit){
// 获取到数据之后调用
listener.invoke()
}
obj.getServerData {
// 高阶函数中处理逻辑
}
相比较java代码而言省去了接口的创建,管理接口对象的管理类的创建,变得很简单易用。等等