Kotlin取代Java? Kotlin像不像金庸武侠里的鸠摩智?

我最近更新了Android开发工具Android Studio,版本为3.4RC2,发现默认的开发语言已经改为kotlin,而不再默认是java了,该来的终于要来了。

本人没有使用过Kotlin,初步了解了Kotlin后,这门语言让我联想到金庸武侠里边的武学奇才鸠摩智!亲自尝试使用其编写代码后,却又感叹Kotlin是真正站在老前辈java肩膀上的新生代高手。一起来了解下Kotlin吧!

一、Kotlin介绍

Kotlin的历史

  • 2010 年: JetBrains 着手开发 Kotlin。
  • 2011 年: JetBrains 公开宣布 Kotlin。
  • 2012 年: JetBrains 在 Apache 2 许可证下开源了 Kotlin。
  • 2016 年: JetBrains 发布了 Kotlin 1.0 版,是比较稳定的正式版。
  • 2017 年: Google IO大会宣布使用Kotlin作为Android的官方开发语言。
  • 2019 年: Kotlin替代java,将成为Android Studio中默认开发语言。

Kotlin名称的由来

Kotlin的命名来源于一个俄罗斯的岛屿的名字,全称是 Kotlin Island -----科特林岛。为啥叫Kotlin呢?因为Kotlin是捷克著名的IDE厂商JetBrains开发的语言,而其在俄罗斯设有分公司,其名称应该就是其俄罗斯分公司给起的。

Kotlin语言的设计目标

  • 创建一种兼容Java的语言
  • 让它比Java更安全,能够静态检测常见的陷阱。如:引用空指针
  • 让它比Java更简洁,通过支持variable type inference,higher-order functions (closures),extension functions,mixins and first-class delegation等实现。
  • 让它比最成熟的竞争对手Scala语言更加简单。

二、Kotlin的武功技能

Kotlin的初衷是取代Java成为更安全更简便的开发语言,但是随着版本的更新,Kotlin的胃口和野心也越来越大,取代Java只是其技能中的一项,还打起了Javascript和C/C++的主意。
在这里插入图片描述
下面说明一下Kotlin各项主要技能

1. 对Java保持100%的兼容

  • Kotlin代码编译后,可以生成Jvm字节码。
  • Kotlin生成的字节码,打包为库文件(jar包),Java可以直接调用。
  • Kotlin可以直接调用现有的Java代码。

基于以上几点,开发者可以毫无后顾之忧地转向Kotlin。

2. 可以编译生成javascript代码

Java目前是拥有开发者数量最多的热门语言,成为Kotlin的猎物;目前Web端开发的热门语言javascript也开发者众多,随着Node.js这样的语言出现后,javascript可以用来写服务端代码,开发者增加得很快,同样也成为Kotlin的猎物。

目前Kotlin编译后,直接生成javascript代码,也就是你学了Kotlin之后,相当于拥有量java和javascript两项技能,你学不学?

3. 可以生成本地机器指令,与C/C++交互

与C/C++的交互,这可以理解,因为Java编程就带有Jni调用C/C++库的场景。Kotlin既然是100%的兼容java,调用C/C++库自然是支持的。

Kotlin支持生成本地机器指令,这个就有点牛X了!Kotlin这是要完全跳出Jvm的束缚,野心不小啊。

除了上面提到的调用C/C++库,开发者还可以用Kotlin编写二进制库文件,生成.h文件并提供给C/C++开发者调用。Kotlin的这个技能,把我吓了一跳!大家都知道, C/C++语言学习的困难程度相比其他编程语言要高一些,如果c++和c能写的,Kotlin也能完成同样同质量的(性能、程序的体积),谁还愿意用C/C++呢?

想象一下,内核驱动可以用kotlin写,甚至linux内核可以用Kotlin写,多美好!

在这里插入图片描述
我亲自在windows上测试了一下Kotlin Native,一个HelloWorld程序体积非常小,只有622KByte,相比go语言的几M来说已经很小了,目前我尚不清楚它是否还有类似于c语言的libc.so这样的依赖。

目前的Kotlin应该还没到达完全能替代C/C++这个程度,这部分技能还不是Kotlin练的最炉火纯青的,但是它打开了人们对未来的憧憬!

说到这里,学一个Kotlin语言,你可以拥有Java, C, C++, JavaScript的能力,你心不心动? Kotlin像不像精通多种武学的鸠摩智?
在这里插入图片描述

三、Kotlin凭啥取代Java成为Android开发第一语言

Java的拥有者–甲骨文公司,今年来对谷歌侵犯其Java版权的诉讼,可能是谷歌决心替换Java的一个因素。然而Kotlin并非仅仅是从语法上再造一个Java,而是确实吸取Java的优点,弥补了Java中一些让人诟病的缺陷,并加入了Java中没有的新语言特性。

Kotlin比Java的语法更简洁

近几年出现的火起来的新语言都有两个特点,一是让开发人员少写代码;二是语言比较容易上手。

Keepsafe公司的App Lock将Java代码全部转换成kotlin后源代码行数减少 30%、方法数减少 10%。

优秀的开发工具支持

Kotlin属于如今首屈一指的JetBrains,其开发的IntelliJ IDEA火得一塌糊涂,谷歌也基于IntelliJ IDEA开发了Android Studio,是Android应用开发者每天都在使用的开发工具。

在Android Studio中,可以直接自动将java代码转换成Kotlin代码。

官方为简化Android开发,为Android Studio提供了kotlin-android 扩展插件。有了这个扩展工具,开发人员可以和findViewById说再见了。

下面对比下java的实现和加上了kotlin-android插件的kotlin代码实现的对比:

Java版本:

public class MainActivity extends AppCompatActivity {
  @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //烦人的findViewById,烦人的类型转换!
        TextView tv = (TextView) findViewById(R.id.text1);
        Botton btn = (Botton ) findViewById(R.id.btn1);
    
        //java的方法调用
        tv.setText("Hello");
        //写法比Kotlin复杂一点
        btn.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View arg0) {
              btn.setText("Haha");
            }
        });
    }
}

Kotlin版本:

//class默认public的可以省略不写
class MainActivity : Activity() {
  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

    //没有findViewById,没有类型转换
    //layout里的id直接拿来用就行
    text1.text="Hello"
    
    //设置监听器也比java简单得多
    btn.setOnClickListener {
      btn.text = "Haha"
    }
  }
}

在这里插入图片描述

其他优秀的语言特性

Kotlin的语言特性,还有好些个,我们挑一些最受开发者欢迎的来简单介绍一下。

在这里插入图片描述

1.Null Safety (空类型安全)

这来源于java中的NullPointerException, 所有Java开发者最讨厌的一个东西,Kotlin从这里入手,明智之举!

//这就是让程序员讨厌的非空检查
if (var != null) { 
  var.xxx();
}

这种非空检查在android7.1系统的framework中大概有一万九千个! google大神写的代码尚且如此,可想而知普通开发者写的有多少个,有多痛恨这空指针异常,多讨厌这种无聊的非空检查。

在kotlin中,直接设置了可为null和不可为null两种类型:

//不可为null对象
var nonNullVar : String = ""

//可为null对象
var mayBeNullVar : String? = null

//如果程序员将不可控对象设置成null
//编译器直接报错
nonNullVar = null

有了这两种对象,kotlin还更进一步对null进行处理

//不可空对象,无需担心空指针
nonNullVar.xxxx()

//可空对象没有检查是否非空前
//直接使用,编译器会报错
mayBeNullVar.xxxx()

//如果不为空则执行
//比java舒服多了
mayBeNullVar?.xxxx()

//还有kotlin的Elvis操作符?:
var m =  b?.length ?: -1

2. Extension functions(扩展功能)

扩展函数也就是说,已经存在的一个类,我们不需要修改这个类的代码,可以给他增加一个方法或者一个属性。这个我第一次听说,好像很玄乎,我们用实际代码来说明:

//下面代码为 MutableList<Int> 添加一个 swap 方法:
fun MutableList<Int>.swap(index1: Int, index2: Int) {
  val tmp = this[index1] // “this”对应该列表
  this[index1] = this[index2]
  this[index2] = tmp
}

//使用这个扩展函数
val l = mutableListOf(1, 2, 3)
l.swap(0, 2)

//为String类添加扩展属性extprop
var String.extprop: Int
    get() = this.length
    set(value){
        println(this.plus(value))
    }

3. Data classes (数据类)

这个特性是把java中的java bean给简化了一下,开发者可以少写一些代码。

//Java中一个一个JavaBean的写法

class Student {
  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的写法,会自动生成getter和setter

class Student {
  var name:String
  var age:Int
}

还有更简单的写法:

class Student(var name:String, var age:Int)

可以看到,这种特性能让开发者少敲些无聊代码,多出来的时间可以用来思考,多受欢迎!

4.Higher order functions (高阶函数)

高阶函数的定义:将函数用作一个函数的参数或者返回值的函数。
说到函数,不得不提一下,kotlin是属于函数式编程语言。也就是说,在kotlin里像c语言那样可以直接写个main函数就能运行,不像java还需要先定义一个类。

//java里,函数脱离不了类

class JavaClass{
  public static void main(String[] args] {
    System.out.println("hello world.");
  }
}

//kotlin里,函数是头等公民

//和c语言一样
fun main() {
  println("hello world.")
}

下面看Kotlin里的高阶函数

//processNumber函数有三个入参,其中
//第三个参数是一个高阶函数
//这个高阶函数接收两个Int,返回一个Int
fun processNumber(a : Int ,  b: Int, 
  doSomeThingFunc : (num1 : Int , num2 : Int) -> Int) : Int{
    return doSomeThingFunc.invoke(a,b)
}

fun main(args: Array<String>) {
  
  //调用processNumber,实现a + b逻辑
  processNumber(a = 123, b = 2){
    a, b -> a + b
  }
  
  //调用processNumber,实现a - b逻辑
  processNumber(a = 123, b = 2){
    a, b -> a - b
  }
  
  //调用processNumber,实现a * b逻辑
  processNumber(a = 123, b = 2){
    a, b -> a * b
  }
  
  //调用processNumber,实现a / b逻辑
  processNumber(a = 123, b = 2){
    a, b -> a / b
  }
}

5. Multi platform (多平台支持)

目前在Windows, Linux, Mac上都能用Kotlin开发,工具支持非常完善。Kotlin可以跑Java虚拟机,所以所有平台都能运行;Kotlin可以生成javascript,所以每个平台上有浏览器就能运行;Kotlin Native可以生成arm32,arm64,x86,mips,x64平台的机器代码,所以Kotlin可以说"无论哪个操作系统,哪个芯片平台,无论是web还是嵌入式,哪都能跑Kotlin",强到令人发指,快要上天了!
在这里插入图片描述

6. CoRoutines (协程)

协程类似于线程,让代码可以并发执行。协程相对于线程来说,更轻量级。在一个进程里可以创建几百万个协程,而线程则不行,因为线程在内核中真正对应了一个轻量级线程,所以一个进程开不了太多线程。
和Go语言一样,Kotlin提供了协程支持。

结束语

从以上分析来看,Kotlin精通多种技能,却并不像鸠摩智那般多而不精,在取代Java生成字节码上Kotlin就非常精,改善了Java而且还有独创技能,自成一派,完全可以取代Java了。该来的终于要来了,Android开发中,Kotlin取代Java大势所趋,Android开发者是时候拥抱Kotlin了。

最后,附上官方中文语言参考地址:
https://www.kotlincn.net/docs/reference/

官方推荐的Kotlin Andriod开发书籍《Kotlin For Android Developers》,国内已经翻译为中文版本,非常适合与转向Kotlin的Android开发者。需要的朋友,关注下方的公众号,后台回复"kotlin_android"获取这本书。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/yinmingxuan/article/details/88734378