了解kotlin并开始使用其做开发,是从最近之前做的项目开始之初,用的是kotlin,发现kotlin是一个特简洁,很多语法糖提供使用,可以提高开发效率的语言。谷歌在2017年谷歌大会正式宣布支持android支持kotlin语言开发,而在更早其实kotlin在2011年左右就已经在JetBrains开始为它着手开始设计,而目前有些大公司已经有配套的对于kotlin和java会有两个语言的开发配套app,说明kotlin势在必行...确实在有些博客看到有些文章也提到过,kotlin的编译速度和java对比,无论是初次编译或者增量编译,都是和java保持着差不多的速度,损失了大概10几个百分点速度极限左右。下面我们来看看kotlin,有个文章的关于kotlin的ppt弄的很好,都是些上手练习的,链接:https://acemerlin.github.io/posts/uncategorized/2017-03-23-kotlin-presentation/
1、相对于我们在平时开发中,一个框架的搭建,如果使用其他语言,(1)需要学习其他语言的成本 (2)重新在该语言下重新开发,所幸其实kotlin是基于jvm的静态编程语言,可以无缝对接java,互相可以调用。这个给我们带来了福音。
2、kotlin有很多的语法糖,有个个人觉得特别重要是,
(1)对于空指针判断的特性,在编译的时候已经帮你提前先做了判断了,而且语法使用起来更简洁,不需要使用更多的if ,else 而是改用 ?,?: 等符号就可以做好判断,简单简洁使用。
(2)数据对象实体类的创建,不再需要手动创建set或get方法,直接kotlin帮你编译生成了,使用序列化也是更加简洁
(3)android开发的同学是不很不喜欢经常需要findviewbyId这些重复的代码呢,觉得严重影响开发效率呢,kotlin帮你可以直接调用layout里面的id然后在编译过程中直接帮你找,其实deCompile下,可以看到是使用了缓存加findviewbyid,kotlin的jvm编译器帮你做了这些工作了,而你只需要import到对应layout的id,直接就可以使用了,是不很简洁; 类似kotlin大量使用了 Lambda的设计,比如view.setOnclickListener{} ,可以不再需要参数,让代码看起来更加简洁,类似还有很多.
(4)for循环支持更多的语法特性,switch传统的支持 int数值判断,而到了kotlin使用when,可以是类的判断,可以是各种其他类型的数据,使用起来更简洁,摆脱了可能会使用大量的if,else的语句,让代码更容易看懂。
3、kotlin的开发可以代码量至少可以减少百分之二十多的代码量,可以大大减少我们平时的开发工作量。
by the way,kotlin也可以作为像除了groovy作为更有效的DSL构建工程的脚本语言,kotlin和groovy在有些语法上有部分差异是相似的,不过kotlin对于安全性判断和严谨性是更胜groovy一筹的,groovy作为的是动态编程语言,小编暂时没做研究,有兴趣的可以了解下。
不过我们在学习kotlin平时开发中,有必要知道可以java与kotlin如何进行一个转换,android studio是在基于idea的,所以idea或者android studio都可以很轻松可以看到他们之间互相转换,有利于我们学习kotlin是怎么下面我们进入正题:
看下面简单代码:
import android.content.Intent import android.os.Bundle import android.support.v7.app.AppCompatActivity import danny.test.TestActivity import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) sample_text.setOnClickListener{ startActivity(Intent(baseContext, TestActivity::class.java)) } } }
然后我们选择菜单栏 Tools -> Kotlin -> show Kotlin Bytesdecode,然后进入
点击左上角的Decompile,就可以生成我们看到的反编译成的java代码了,如下
public final class MainActivity extends AppCompatActivity { private HashMap _$_findViewCache; protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.setContentView(-1300027); ((TextView)this._$_findCachedViewById(id.sample_text)).setOnClickListener((OnClickListener)(new OnClickListener() { public final void onClick(View it) { MainActivity.this.startActivity(new Intent(MainActivity.this.getBaseContext(), TestActivity.class)); } })); } public View _$_findCachedViewById(int var1) { if (this._$_findViewCache == null) { this._$_findViewCache = new HashMap(); } View var2 = (View)this._$_findViewCache.get(var1); if (var2 == null) { var2 = this.findViewById(var1); this._$_findViewCache.put(var1, var2); } return var2; } public void _$_clearFindViewByIdCache() { if (this._$_findViewCache != null) { this._$_findViewCache.clear(); } } }
其实认真观察我们每次调用sample_text 这个变量的时候,其实都是调用了_$_findCachedViewById这么个方法,每次去从缓存去找,没有缓存就才直接findviewById然后添加缓存,其实这样对于我们个人理解kotlin的代码的底层实现是不很有好处呢
有时候在想,语言的底层是怎么实现的,其实是不蛮重要的,知其然而所以然,对于我们以后去接触新的语言,其实是不有好处呢。大概了解了下,像比如php 1.4还是1.5的版本有些是像java学习了,其实语言之间有些特性或者语法糖有些是互相学习,也是有点套路的,像我们java的很多语法其实是继承了c语言的语法,数据类型,关键字这些,从某个方面来说,也听郭神也说,觉得java顶多属于半个面向对象的语言..最近也在接触groovy,groovy对于构建创建工程,动态配置,可以写自己的个人插件,用来动态配置工程的差异化需求是个很好的语言。
总之,语言的学习我们可以先了解它的使用场景、特性、可以做什么、是否在项目中使用有好处等等。比如groovy天生是面向java工程的DSL构建工程的动态编程语言,python可以用来做脚本开发,android的打包等,服务器开发、大数据。
而kotlin可以 开发我们的android、后端、脚本等。