Kotlin对比Java编程语言其优势在哪里?

开发 后端
通过文中对比,我们应该可以看到作为一门现代编程语言的特点和具备的优势,而且关于Kotlin好用的特性我们还没有完全列举完,比如便捷的集合操作、属性委托、扩展函数等等。

随着计算机语言的发展,以成本为核心的驱动力,推动着经历了汇编、C、C++、Java、Kotlin的发展,其目的在于让开发人员更好的聚焦于业务,而不用太关注语言本身的处理。

近几年,又开始流行更高级的语言,它们被称之为现代编程语言,比如Rust、Go、Kotlin和TypeScript等。现代的核心原因,我认为可以总结为以下几点:

  • 入门更容易
  • 类型推断
  • 空指针安全
  • 内置的并发支持
  • 减少模板代码(简洁)
  • 操纵集合更容易
  • 更智能的垃圾回收

以上不一定非常全,但是一定程度上概括了现代语言的特点,下面我们就基于Kotlin和Java的对比,来看下Kotlin的优势。

new个对象

new一个对象,是我们在编程中最常用的操作之一,让我们先看下如何在Java中new一个对象。

  1. List<String> list =new ArrayList<String>(); 
  2. list.add("hello world"); 

在Java中,我们需要定义一个变量,然后通过new关键字声明一个ArrayList的示例,这样我们就可以使用他了。

但是在Kotlin,new一个对象会更简洁。

  1. var list:ArrayList<String> = ArrayList<String>() 

直接省略了new关键字即可。

类型推断

对于以上的Kotlin代码,我们完全可以省略掉变量:后面的类型声明,因为kotlin可以自己推断出来。

  1. val list = ArrayList<String>() 

是不是觉得更简洁了?我们开发的效率也更高了。

空指针安全

在Java中,变量,方法的参数等都是可以为null的,但是在Kotlin中默认是不允许的,通过这种强制的限制,更好的避免空指针异常。

  1. var list = ArrayList<String>() 
  2. list = null 

以上代码,在编译期你会得到一个错误提示:

  1. Null can not be a value of a non-null type ArrayList<String> 

如果我们的确需要null赋值怎么做呢?在Kotlin中需要开发者自己显示声明才可以。

  1. var list:Array<String>? = null 

如上所示,在类型后加?即可。但是注意,我们不提倡这种做法,在实际的开发中,你会发现?大部分都是为了兼容Java代码使用的。

属性

我们通常会把数据和对数据的处理封装到一个类中,如果类中有私有字段,我们还需要提供getter和setter方法提供访问和修改字段的方法。

  1. //Person.java 
  2. public  class Person { 
  3.   private String name
  4.  
  5.   public String getName() { 
  6.     return name
  7.   } 
  8.  
  9.   public void setName(String name) { 
  10.     this.name = name
  11.   } 
  12. //Main.java 
  13. public static void main(String[] args) { 
  14.   Person p = new Person(); 
  15.   p.setName("张三"); 
  16.   System.out.println(p.getName()); 

以上是我们通过Java实现的一个Person类,并且定义了name私有字段,同时提供了getter和setter方法,这样我们才能够使用它。

通过以上代码,大家可以看到,我们为了实现一个name的存储,写了很多代码,如果一个类存在很多字段,我们会写更多的不必要的getter和setter方法。

现在我们看在Kotlin中如何实现上面的功能。

  1. //Person.kt 
  2. class Person { 
  3.   var name:String = "" 
  4.  
  5. //main.kt 
  6. fun main(){ 
  7.   val p = Person() 
  8.   p.name = "张三" 
  9.   println(p.name

是的,就是这么简单,只需要这么几行代码,就可以实现和Java一样的功能,因为Kotlin可以帮我们自动的生成getter和setter这些模板代码,就省了我们很多事情,大大的提高了我们的开发效率,并且整个代码也更简洁。

这里需要注意的是,如果字段是val声明的,那么只会生成getter方法,因为val是不可修改的,等价于Java中的final修饰符;如果字段是var的,可以同时生成getter和setter方法,这时候就可以对字段赋值了。

数据类

Kotlin的简洁不仅仅体现在getter和setter方法上,还有数据类。一个数据类是一个数据容器,它用来存放数据。

一个好的数据类的声明,不仅有私有的字段、getter和setter方法,还要有toString、equals和hashCode方法的实现,以便对他们进行打印、比较以及更好的储存在map中。

还是以Person类为例,一个合格的数据类代码如下:

  1. public static  class Person { 
  2.   private String name
  3.  
  4.   public Person(String name) { 
  5.     this.name = name
  6.   } 
  7.  
  8.   public String getName() { 
  9.     return name
  10.   } 
  11.  
  12.   public void setName(String name) { 
  13.     this.name = name
  14.   } 
  15.  
  16.   @Override 
  17.   public boolean equals(Object o) { 
  18.     if (this == o) return true
  19.     if (o == null || getClass() != o.getClass()) return false
  20.  
  21.     Person person = (Person) o; 
  22.  
  23.     return Objects.equals(name, person.name); 
  24.   } 
  25.  
  26.   @Override 
  27.   public int hashCode() { 
  28.     return name != null ? name.hashCode() : 0; 
  29.   } 
  30.  
  31.   @Override 
  32.   public String toString() { 
  33.     return "Person{" + 
  34.       "name='" + name + '\'' + 
  35.       '}'
  36.   } 

看下我们Java的实现,需要有这么30多行代码才能实现。如果我们使用Kotlin会是怎样的呢?

  1. data class Person(val name: String) {} 

只需要这么一行代码,以上的Java功能都会实现,这里的关键在于一个data修饰符,是不是很酸爽。

并发

Kotlin提供了协程来实现并发,相比Java的Thread和Executor等来说,它更轻便,简洁。我们对比下并发的基本实现。

  1. public static void main(String[] args) throws InterruptedException { 
  2.   new MyThread().start(); 
  3.   System.out.println(Thread.currentThread().getName()+":main"); 
  4.   //保证JVM存活 
  5.   Thread.sleep(1000); 
  6.  
  7. private static class MyThread extends Thread{ 
  8.   @Override 
  9.   public void run() { 
  10.     try { 
  11.       Thread.sleep(500); 
  12.       System.out.println(Thread.currentThread().getName()+":Thread"); 
  13.     } catch (InterruptedException e) { 
  14.       e.printStackTrace(); 
  15.     } 
  16.   } 

运行查看输出,我们发现MyThread并没有阻塞main的执行,也就是并发了。

  1. main:main 
  2. Thread-0:Thread 

但是要注意到,Java使用了两个线程,一个是main,一个是Thread-0。同样的功能,我们现在使用kotlin实现下:

  1. fun main(){ 
  2.   runBlocking { 
  3.     launch { 
  4.       delay(500) 
  5.       println("${Thread.currentThread().name}:Thread"
  6.     } 
  7.     println("${Thread.currentThread().name}:main"
  8.   } 

相比Java来说更简洁,而且我们看下打印的输出:

  1. main:main 
  2. main:Thread 

竟然是在同一个线程上实现的并发,少了一个线程的申请开销,效率更高,这也是kotlin提出协程的概念。如果我们不想让它在main线程上执行,可以通过切换调度器来实现。

  1. launch(Dispatchers.IO) 

只需要把上面的代码的launch换成launch(Dispatchers.IO)即可,这样调度器就给我们分配了一个IO的线程池来执行我们的代码。如果我们使用Java来实现,要自己定义线程池,还要提交Runnable,整个代码是非常多的。

  1. main:main 
  2. DefaultDispatcher-worker-1:Thread 

kotlin的协程非常强大和简洁,通过以上的例子,不能完全展示它的特性,剩下的如协程上下文、调度器、Flow、通道等能力大家可以自己摸索。

小结

通过以上对比,我们应该可以看到作为一门现代编程语言的特点和具备的优势,而且关于Kotlin好用的特性我们还没有完全列举完,比如便捷的集合操作、属性委托、扩展函数等等。

责任编辑:未丽燕 来源: 今日头条
相关推荐

2012-02-17 09:33:08

KotlinJavaJVM

2011-08-01 10:10:22

私有云公有云

2010-09-10 10:30:39

DIV+CSS

2021-10-28 22:31:11

存储云存储数据

2022-07-31 21:36:30

工业机器人机器人

2011-07-12 17:42:46

PHP

2017-12-18 17:04:08

编程语言排行榜KotlinC

2018-08-09 18:27:03

编程语言JavaPython

2019-08-13 06:50:31

编程语言排行榜Python

2011-07-20 11:06:58

Mozilla

2024-09-20 09:30:44

2024-04-24 12:03:20

2021-10-27 09:33:01

数字人民币微信支付宝

2009-06-23 09:07:38

2009-04-28 16:18:29

Linux开源软件优势

2010-09-28 08:58:22

WLAN无线交换机管理

2020-12-02 09:51:06

C++语言学习

2017-12-09 22:09:05

编程KotlinC语言

2023-11-06 07:56:04

2019-06-04 08:30:57

KotlinPHP语言
点赞
收藏

51CTO技术栈公众号