close
当前位置: 物联网在线 > 技术文库 > android >

使用Kotlin进行Android开发

Kotlin,原意是在俄罗斯的一个小岛,JetBrain在2011年推出了以这个来命名的一个运行在JVM上的语言, 看上去有点类似C#和Scala的结合,并且同为静态类型,作为一门JVM上的语言,可以轻松兼容Java,并且整个语言设计的非常轻量。目前的版本为0.12.200,尚未发布正式版。

Kotlin的下载和配置在其官网上有,在这里就不再赘述了,值得一提的是,作为JetBrains家出品的语言,自家的IDEA当然全力支持!

基本语法介绍

Kotlin的语法非常简洁,熟悉Java或者Scala的人都可以快速上手:

函数声明:

fun foo(va: Int): Int { return 1 }

也可以单行声明:

fun foo(va: Int): Int = 1

lambda当然也是支持的:

var c = {foo: Int -> println(foo)}

Kotlin中的函数是一等对象,自然支持高阶函数:

var c = {foo: Int -> println(foo)} fun fooTest(func: (Int)->()) = println("I'm Groot") fooTest(c)

类与接口

类可以这样进行声明:

class Bar(var b: Int): Foo() { var c = 1 init { println("class initializer") } constructor(): this(1) { println("secondary constructor") } }

Bar类在这里继承了Foo类,Bar类有两个构造函数,直接在Bar类头的是primary constructor,另外一个构造函数使用constructor关键字定义,注意必须要先调用primary constructor,另外,init标明的是class initializer,每个构造函数都会首先调用class initializer里面的代码,再调用构造函数

Inner class:

class Outer { class Inner { } }

Kotlin同样支持嵌套的内部类,不过和Java不一样的是,Kotlin的内部类不会默认包含一个指向外部类对象的引用,也就是说,Kotlin中所有的内部类默认就是静态的,这样可以减少很多内存泄露的问题。另外,如果需要在内部类中引用外部类对象,可以在Inner类的声明前加上inner关键字,然后在Inner类中使用标记的this:this@Outer来指向外部类对象

Singleton:

object Single { var c = 1 fun foo() = println("foo") }

Kotlin中使用object关键字声明一个singleton对象,后面这里的方法就可以直接使用Single.foo()来调用了

Interface:

interface Interface { fun foo() { println(1) } fun bar() }

Kotlin中的interface,跟其他语言的trait非常像,而且也可以带有默认的实现方法,并且不允许通过属性来维护状态。事实上,在上个版本中,interface的原来名称是trait,而在M12现在这个版本中又改成了interface而已

Null safe and Smart type cast

Null safe:

在Kotlin中,严格区分了nullable和非nullable对象,甚至在编译期解决了不少潜在的空指针问题:

我们先来看下普通的变量声明

var c: String = "12123"

这里声明了一个String对象,其值为"12123",我们可以正常的使用这个对象的成员方法:c.length()

但是,如果在初始化的时候,变量c为空的话,这样声明就是错误的,会编译不过:

var c: String = null

正确的声明应该是这样:

var c: String? = null

这里在String后面加多了一个问号,表明这里是一个Nullable的对象,说明这个变量在使用的过程中可能为空,而且,在调用这个变量的成员的时候,必须要使用这种语法:c?.length(),在调用的时候添加了一个问号,表明,如果c为空的时候,length()这个方法就不会调用。coffe-script也有类似的,这种语法糖减少了很多平时用到的Null-checked,简化了代码,而且从编译器开始介入null-checked,大大减少了潜在的NullPointerException,而事实上,null的确也是一个billion dollar mistake

常年进行如此的调用语法常常会很恼人,因此在你进行显式的Null-checked的时候,Kotlin的编译器会认为后续的调用已经无需进行Null-checked,可以直接调用了:

if (c != null) { c.length() }

Smart type cast

在Kotlin中,进行强制类型转换可以使用as关键字,但有可能会抛出异常,因此,Kotlin引入了smart type cast:

if (c is String) { c.length() }

在上面的例子中,如果c是一个String对象,则在if块中,可以直接使用String的方法,编译器会智能的帮你识别出c在if-blcok里面是一个String对象

Pattern Matching

Kotlin在一定程度上支持了一些FP的特性,包括强大的Pattern Matching,在Kotlin中可以使用when关键字:

var x = 3 when (x) { 1 -> print("x == 1") 2 -> print("x == 2") in 1..10 -> print("x is in the range") !in 10..20 -> print("x is outside the range") is Int -> println("is int") else -> { // Note the block print("x is neither 1 nor 2") } }

Function Extension

在Java中我们经常需要给系统的类添加一些实用的方法,但苦于不能直接扩展,于是就有了各种的xxxUtils类,导致代码非常恶心,但是在Kotlin中,我们可以直接扩展库里面类的方法,通过function extension:

fun String.fucker() { println("a fucker") }

上面给String类添加了一个fucker方法,我们可以直接使用:

"123123".fucker()

这大大的减少了我们写xxxUtils类的必要性

配置使用Kotlin进行Android开发
(责任编辑:ioter)

用户喜欢...

使用Android Studio开发可独立运行(runnable)混淆过的Jar程序

之前开发Java程序一直都是使用Eclipse 开发Jar程序,现在开发基本上都已经弃用Eclipse了,但是有时偶尔开发个小的Jar程序,还要切换回去好麻烦,刚好前几天有人问几个相关的问题,就顺便整...


Android Studio使用小技巧,只能说666

一般的什么快捷键,技巧的文章也有很多。我也看过很多。下面这些事我在来自国外大神发布的:Android Studio Tips of the Day( https://plus.google.com/u/0/collection/wtO0PB )查看到的,而且对于我来说有...


android studio 使用gradle打jar包并混淆

昨天准备把写好的代码使用gradle打jar包出来,并打算加混淆。打jar包容易,结果在混淆上走了弯路。 首先打jar包的配置很简单,使用jar的task,具体代码如下: task buildJar(type: Jar, dependsOn: ['...


详解如何使用代码进行音频合成,以Java为示例语言,以Android为示例平台

音频合成在现实生活中应用广泛,在网上可以搜索到不少相关的讲解和代码实现,但个人感觉在网上搜索到的音频合成相关文章的讲解都并非十分透彻,故而写下本篇博文,计划通过讲解如何...


Android应用性能优化之使用SparseArray

最近在看一些Android应用性能优化的文章时,发现提到了SparseArray替代HashMap可以优化app性能,就对SparseArray做了一番了解,并记录使用心得。 我们来看看SparseArray点击进去包含了那些方法 ////...


Android线程,线程池使用及原理博文参考

这块的知识可以说是一大块,要撸清楚还是要花点时间,线程池中关联到的队列不仅在线程池中使用,在各种第三方网络框架和图片框架等等中也是通过自己调度队列来实现异步。有关理论的东西...


Android中使用Rxjava时,内存泄漏了吗?

今天有位同学问了我一个问题,话说,问我 “有遇到网络请求一半,退出Activity造成的Theard泄露吗?已在销毁时调用了un了 我去查看了下rx的源码的unsubscribe方法,定位到一个实现类,NewThre...


Retrofit使用OkHttp保存和添加cookie

Retrofit的cookie的保存和添加都可以用 Interceptor 来实现 下面是接收请求中返回并保存cookie的代码示例: public class ReceivedCookiesInterceptor implements Interceptor {private Context context;public ReceivedCookiesInterc...


ConstraintLayout约束布局的概念与使用

ConstraintLayout(约束布局) , 是2016年Google I/O最新推出的Android布局, 目前还在完善阶段. 从推出的力度而言, 应该会成为主流布局样式. 在最新版本的Android Studio中, ConstraintLayout已经成为默认布局....


Andorid Studio使用技巧

该文以Android Studio2.1.1(Bundle)为例。JDK使用的是1.8版本,也建议大家使用1.8版本。 使用技巧无先后顺序。 Android Studio 2.1.1 软件下载 目前,国内大家比较熟悉的应该是 Android Studio中国社区 ,...