没有合适的资源?快使用搜索试试~ 我知道了~
Kotlin也是基于JVM设计的编程语言,算是对Java的温和改良,她是一个开源项目的成果,拥有很高的声望,很多公司、组织、业界大犇都很喜欢她,Square公司的Jake大神(Dagger、ButterKnife、Retrofit、OkHttp...之父)就专门写了篇Using Project Kotlin for Android为Kotlin站台。 相对Java来说,Kotlin在编写代码时有如下优势:代码简洁高效、函数式编程、空指针安全、支持lambda表达式、流式API等。 在执行效率上,Kotlin和Java具有同样的理论速度(都是编译成JVM字节码)。 另外,新语言必须考虑兼容性,为了与存量项目代码和谐共处,Kotlin和Java是互相完美兼容的,两种代码文件可以并存,代码可以互相调用、文件可以互相转换,库文件也可以无障碍地互相调用,据说使用Kotlin基本不会带来额外的成本负担。 编程语言本质上还是工具,要运用工具提高效率和质量,还要看具体开发者,我们先看看Kotlin相对Java有哪些特色。
资源推荐
资源详情
资源评论
Google 在今年的 IO 大会上宣布,将 Android 开发的官方语言更换为 Kotlin,作为跟着 Google 玩儿 Android 的人,我们必须尽快了解和使用 Kotlin 语言。
不过 Kotlin 毕竟是语言级别的新事物,比起 Java 来说,从编程思想到代码细节都有不少变化,我们最好先对 Kotlin 有个整体的基本的了解,然后再去学习和
使用,这样才能高效地掌握 Kotlin 语言。
Java 的辉煌与阴影
1995 年,当年如日中天的 Sun 公司发布了 Java 语言,引起了巨大的轰动,与当时主流的 C 语言和 Basic 语言比起来,Java 语言简单、面向对象、稳定、与
平台无关、解释型、多线程、动态等特点,就像是打开了一个新的世界,一时间风靡全球,云集者众,微软为了模仿 Java 搞出 C#语言,Netscape 为了赶时
髦硬塞出一个 JavaScript 语言,IBM 则捏着鼻子做了 Java IDE Eclipse(日蚀,呵呵)。直到现在,Java 在编程世界里还占据着举足轻重的地位,Andy Rubin
在开发 Android 系统时,也很自然地采用了 Java 和 C++(C++负责 NDK 开发)作为开发语言。
但是,Java 毕竟是 20 多年前的语言了,虽然有不断扩展更新,但是底层设计思想是很难改动的,这就导致它很难实现一些新的语言特性,例如函数式编程、
Lambda 表达式、流式 API、高阶函数、空指针安全等(虽然 Java8 实现了部分特性,但是 Android 还不怎么支持 Java8),这些新的语言特性大受好评,可
以说解放了编程的生产力,这其实也说明了一个事实:开发效率/时间是软件公司真正的瓶颈,任何能压缩代码量,提高开发效率的举措,都应该受到重视。
而且,Android 还存在 Java 版权危机的问题,收购了 Sun 公司的 Oracle 曾向 Google 索要巨额的 Java 版权费,这可能也加快了 Google 寻找 Android 开发
替代语言的动作。
苹果公司已经在用 Swift 语言替代 Object-C 语言,Google 也找到了替代 Java 的语言,也就是 JetBrains 公司(Android Studio 也是用该公司的 Intelli J 改
的)主推的 Kotlin。
其实,Swift 和 Kotlin 还挺相似的,有一篇 Swift is like Kotlin 对这两种语言做过简单的对比。
Kotlin 的出现
Kotlin 也是基于 JVM 设计的编程语言,算是对 Java 的温和改良,她是一个开源项目的成果,拥有很高的声望,很多公司、组织、业界大犇都很喜欢她,Square
公司的 Jake 大神(Dagger、ButterKnife、Retrofit、OkHttp...之父)就专门写了篇 Using Project Kotlin for Android 为 Kotlin 站台。
相对 Java 来说,Kotlin 在编写代码时有如下优势:代码简洁高效、函数式编程、空指针安全、支持 lambda 表达式、流式 API 等。
在执行效率上,Kotlin 和 Java 具有同样的理论速度(都是编译成 JVM 字节码)。
另外,新语言必须考虑兼容性,为了与存量项目代码和谐共处,Kotlin 和 Java 是互相完美兼容的,两种代码文件可以并存,代码可以互相调用、文件可以互相
转换,库文件也可以无障碍地互相调用,据说使用 Kotlin 基本不会带来额外的成本负担。
编程语言本质上还是工具,要运用工具提高效率和质量,还要看具体开发者,我们先看看 Kotlin 相对 Java 有哪些特色。
Kotlin 的特色
Kotlin 作为 Java 的改良,在 Android 开发中有很多优势,我们先从相对直观的界面绘制开始了解,然后看看 Kotlin 的语法特点,再慢慢去接触更深层次的编
程思想。
简化 findViewById
我们知道,Android 的架构里,xml 布局文件和 Activity 是松耦合的,Activity 中要使用界面元素,必须借助 R 文件对 xml 控件的记录,用 findViewById 找
到这个元素。
在 Kotlin 中我们可继续使用 findViewById 去绑定 xml 布局中的控件:(TextView)findViewById(R.id.hello);
进一步引用 Anko 之后,可以使用 find 函数去绑定控件:find(R.id.hello),不需要类型转换
同时,Kotlin 还提供一种更激进的方法,通过在 gradule 中引用 applyplugin:'kotlin-android-extensions',彻底取消 findViewById 这个函数,具体做法如
下:
首先,在 app 的 gradule 中,添加引用
添加引用
然后,在 Activity 中直接根据 id 使用界面元素
直接操作界面元素
按住 Ctrl 键,会提示我们这个控件详情
提示详情
点击后,可以直接跳转到 xml 文件中的控件位置,光标会停留在 Id 处
直接跳转到控件 Id 处
这种特性令人联想起 C#语言中对界面控件的管理,在 C#里,界面的控件可以直接调用,不需要 find,这是因为在创建一个 Form1.cs 界面文件时,IDE 会自
动创建一个对应的额 Form1.designer.cs 类,在这个类里,自动管理所有界面控件的对象。
Kotlin 也是类似的思路,它会遍历你的 xml 文件,创建对应的虚拟包给你引用(用 Alt+Enter 引用),我们使用的控件对象,其实是这个虚拟包里的控件对象。
引用虚拟界面类
为什么说这个包是虚拟的,因为它是 kotlin 临时创建的,你无法打开它的文件,在编译 apk 时,Kotlin 会自动帮你补充 findViewbyId 的代码,最终得到的产
品其实没变,它只是方便了程序员的书写。
Anko
Anko 其实是一种 DSL(领域相关语言),是专门用代码方式来写界面和布局的。
上一节针对 findViewById,最激进的方式是取消这个函数,这一节更加激进,我们可以连 XML 布局文件也取消掉。
在 XML 中定义界面布局当然是有好处的,分层清晰,代码易读,现在 AS 中预览效果也不错。但是它渲染过程复杂,难以重用(虽然有 including),而如果
我们用 Java 代码去替换 xml,代码会更加复杂和晦涩。
Anko 却实现了在代码中简洁优雅地定义界面和布局,而且由于不需要读取和解析 XML 布局文件,Anko 的性能表现更佳。
我们可以看看 Anko 在 Github 上的代码示例,用 6 行代码就做出了一个有输入框、按钮、点击事件和 Toast 的界面和功能
示例的界面和功能
我们自己写一下这 6 行代码,首先需要在 gradle 中添加引用,主要是 sdk 和 v4/v7 包
Gradle 中引用 Anko
然后参照 Anko 在 Github 中的示例,实现这 6 行代码。
参考 Github 的 Anko 实例代码
Activity 本来会在加载时在 onCreate 函数里用 setContentView 函数来寻找布局文件,并加载为自己的界面,在这里,Anko 代码替代了 setContentView,
直接告诉 Activity 应该如何绘制界面。
(在 Fragment 里不可以这样直接写 verticalLayout,因为加载机制不一样,Fragment 需要在 onCreateView 函数里 inflate 并返回一个 View 对象,所以对
应的 Anko 代码也需要写在 onCreateView 函数里并返回一个 View,可以用 return with(context){verticalLayout[...]}或者 return
UI{verticalLayout[...]}.view)
可以看到,代码非常简洁干练,不像以往的 Android 代码那样拖沓,这既与 Kotlin 的语法有关,也与 Anko 能用代码实现界面和布局有关。
这段代码虽然简洁,可是却失去了 MVC 分层的好处,因为 V 直接写在业务代码里了,这个问题好解决,我们可以把 Anko 布局代码放到一个专门的类文件里
抽出 Anko 布局代码
然后在 Activity 引用这个布局类来绘制界面
引用 Anko 布局类
虽然 Anko 效率很高,代码简洁,清爽直观,但是目前还有很多坑,主要包括:
1.AS 并不支持直接预览 Anko 界面,虽然有个 Anko DSL Preview 插件,但是需要 make 才能刷新,而且和现在的 AS 不兼容。
2.如果要在多版本中动态替换外部资源,需要用动态类加载才能实现,无法借用资源 apk 实现。
3.不方便根据 view 的 id 去即时引用 view 控件(R 文件和 inflate 这时反而更加灵活)。
另外,Anko 还在异步、日志、Toast、对话框、数据库等方面提供优化服务,是否采用就看自身需要了。
Kotlin 语法特点
看了上面这些例子,我们发现 Kotlin 本身的语法和 Java 有些不一样,新语言嘛,相对 Java 而言,主要的变化有这么几条:
1.没有“;”
在 Kotlin 语法里,代码行不需要用“;”结尾,什么都不写就好
2.重要的“:”
在 Java 里,“:”主要在运算符里出现(for/switch/三元运算符等)。
在 Kotlin 里,“:”的地位大大提升了,它的用途非常广泛,包括:
定义变量类型
var name:String="my name" //变量 name 为 String 类型
定义参数的类型
fun makeTool(id:Int){ //参数 id 为 Int 类型
}
定义函数的返回值
fun getAddr(id:Int):String{ //返回值为 String 类型
}
声明类/接口的继承
class KotlinActivityUI :AnkoComponent<KotlinActivity>{//继承 AnkoComponent 接口
使用 Java 类
val intent = Intent(this, MainActivity::class.java) //需要用::来使用 Java 类,注意是两个“”
3.没有“new”
Kotlin 实例化一个对象时不需要 new 关键字
var list=ArrayList()
4.变量、常量、类型推断
用 var 定义变量(像 js)
var name:String="my name"
用 val 定义常量(相当于 final)
val TAG:String="ClassName"
上面两个例子用:String 来定义了数据类型,这个是可以省略的,Kotlin 支持类型推断,这两句话你可以写成
var name="my name"
val TAG="ClassName"
5.初始化和延迟加载
在 Java 里,我们可以定义一个变量,但是并不赋值(int 和 boolean 会有默认值)
但是 Kotlin 里必须为变量赋值,如果只写一个变量,却不赋值,像下面这样:
var name
编译器会报错,提示你未初始化,你必须赋值为 0 或者 null,或者别的什么值。
不过,我们有时候就是不能在定义变量时就初始化它,比如在 Android 中我们经常预定义一个 View 控件而不初始化,但是直到 onCreate 或 onCreateView
时才初始化它。
针对这种情况,Kotlin 提供了懒加载 lazy 机制来解决这个问题,在懒加载机制里,变量只有在第一次被调用时,才会初始化,代码需要这样写
在初次调用时初始化变量的 lazy 机制
lazy 只适用于 val 对象,对于 var 对象,需要使用 lateinit,原理是类似的,只是代码需要这样写
var 变量使用 lateinit 机制
6.空指针安全
在 Kotlin 里,可以用“?”表示可以为空,也可以用“!!”表示不可以为空。
空指针安全并不是不需要处理空指针,你需要用“?”声明某个变量是允许空指针的,例如:
var num:Int?=null
剩余16页未读,继续阅读
资源评论
小小哭包
- 粉丝: 1934
- 资源: 4120
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功