目录
kotlin用于android开发
使用kotlin进行android开发:
- 代码更少,可读性强,花费更少的时间来编写代码与理解其他人编写的代码
- kotlin不仅仅是语言,也是一个强大的工具.并且他还在一直发展.目前kotlin已经完美的集成到android studio中,并且许多公司也积极的使用kotlin进行android应用开发
- 与java的互操作性,kotlin可以在程序中将kotlin与java变成语言一起使用,而且不需要将所有代码迁移到kotlin
- 支持多平台开发,不仅可以使用kotlin开发android.还可以开发iOS,后端与Web应用程序,享受在平台之间共享公共代码的好处
- 代码安全,更少的代码与更好的可读性导致更少的错误.kotlin编译器检测这些剩余的错误.从而使代码安全.
- 易学易用,kotlin非常易于学习.尤其是对java开发人员而言
- kotlin得到了社区的大力支持与许多贡献,该社区在全世界范围内都早增长,根据google的说法,play商店前1000个应用中60%以上都使用kotlin
kotlin的基本语法:
包的声明在源文件的最顶部
package my.demo
import kotlin.text.*
//
kotlin应用程序的入口是main函数
fun main(){
println("kotlin")
}
带有两个int参数\返回int函数
fun sum(a: Int, b: Int): Int {
return a + b
}
fun main() {
print("sum of 3 and 5 is ")
println(sum(3, 5))
}
将表达式作为函数体,返回值类型自动推断的函数
fun sum(a: Int, b: Int) = a + b
fun main() {
println("sum of 19 and 23 is ${sum(19, 23)}")
}
函数返回无意义的值
fun printSum(a: Int, b: Int): Unit {
println("sum of $a and $b is ${a + b}")
}
fun main() {
printSum(-1, 8)
}
定义只读局部变量使用关键字val定义,只能为其赋值一次
val a: Int = 1 // 立即赋值
val b = 2 // 自动推断出 `Int` 类型
val c: Int // 如果没有初始值类型不能省略
c = 3 // 明确赋值
可重新赋值的变量使用var关键字
var x = 5 // 自动推断出 `Int` 类型
x += 1
注释与大多数现代语言一样,kotlin支持单行与多行(快)注释
// 这是一个行注释
/* 这是一个多行的
块注释。 */
并且kotlin中的注释可以嵌套
/* 注释从这里开始
/* 包含嵌套的注释 */
并且在这里结束。 */
字符串
var a = 1
// 模板中的简单名称:
val s1 = "a is $a"
a = 2
// 模板中的任意表达式:
val s2 = "${s1.replace("is", "was")}, but now is $a"
条件表达式
fun maxOf(a: Int, b: Int): Int {
if (a > b) {
return a
} else {
return b
}
}
并且在kotlin中if也是可以用作表达式的:
fun maxOf(a: Int, b: Int) = if (a > b) a else b
当某一个变量的值可以是null的时候,必须在声明出的类型后添加?来标识该应用可以为空
fun parseInt(str: String): Int? {
// ……
}
使用返回空值的函数
fun printProduct(arg1: String, arg2: String) {
val x = parseInt(arg1)
val y = parseInt(arg2)
// 直接使用 `x * y` 会导致编译错误,因为它们可能为 null
if (x != null && y != null) {
// 在空检测后,x 与 y 会自动转换为非空值(non-nullable)
println(x * y)
}
else {
println("'$arg1' or '$arg2' is not a number")
}
}
或者也可以这样写
// ……
if (x == null) {
println("Wrong number format in arg1: '$arg1'")
return
}
if (y == null) {
println("Wrong number format in arg2: '$arg2'")
return
}
// 在空检测后,x 与 y 会自动转换为非空值
println(x * y)
类型检测与自动类型转换
is运算符检测一个表达式是否是某一个类型的实例,如果一个不可变的局部变量或者属性已经判断出为某类型,那么检测后的分支中可以直接当做该类型使用,不需要显示转换
fun getStringLength(obj: Any): Int? {
if (obj is String) {
// `obj` 在该条件分支内自动转换成 `String`
return obj.length
}
// 在离开类型检测分支后,`obj` 仍然是 `Any` 类型
return null
}
for循环
val items = listOf("apple", "banana", "kiwifruit")
for (item in items) {
println(item)
}
或者也可以这样写
val items = listOf("apple", "banana", "kiwifruit")
for (index in items.indices) {
println("item at $index is ${items[index]}")
}
when表达式
val items = listOf("apple", "banana", "kiwifruit")
var index = 0
while (index < items.size) {
println("item at $index is ${items[index]}")
index++
}
代码规范
不管是哪一种语言都少不了代码规范
目录结构
在纯 Kotlin 项目中,推荐的目录结构遵循省略了公共根包的包结构。例如,如果项目中的所有代码都位于 org.example.kotlin
包及其子包中,那么 org.example.kotlin
包的文件应该直接放在源代码根目录下,而 org.example.kotlin.network.socket
中的文件应该放在源代码根目录下的 network/socket
子目录中。
源文件名称
如果 Kotlin 文件包含单个类(以及可能相关的顶层声明),那么文件名应该与该类的名称相同,并追加 .kt 扩展名。如果文件包含多个类或只包含顶层声明, 那么选择一个描述该文件所包含内容的名称,并以此命名该文件。 使用首字母大写的驼峰风格(也称为 Pascal 风格), 例如 ProcessDeclarations.kt
。
源文件组织
鼓励多个声明(类、顶级函数或者属性)放在同一个 Kotlin 源文件中, 只要这些声明在语义上彼此紧密关联并且文件保持合理大小 (不超过几百行)。
特别是在为类定义与类的所有客户都相关的扩展函数时, 请将它们放在与类自身定义相同的地方。而在定义仅对指定客户有意义的扩展函数时,请将它们放在紧挨该客户代码之后。不要只是为了保存 “Foo 的所有扩展函数”而创建文件。
类布局
通常,一个类的内容按以下顺序排列:
- 属性声明与初始化块
- 次构造函数
- 方法声明
- 伴生对象
不要按字母顺序或者可见性对方法声明排序,也不要将常规方法与扩展方法分开。而是要把相关的东西放在一起,这样从上到下阅读类的人就能够跟进所发生事情的逻辑。选择一个顺序(高级别优先,或者相反)并坚持下去。
将嵌套类放在紧挨使用这些类的代码之后。如果打算在外部使用嵌套类,而且类中并没有引用这些类,那么把它们放到末尾,在伴生对象之后。
接口实现布局
在实现一个接口时,实现成员的顺序应该与该接口的成员顺序相同(如果需要, 还要插入用于实现的额外的私有方法)
重载布局
在类中总是将重载放在一起。