Kotlin| 实践

2019-11-28  本文已影响0人  请叫我林锋

本文用于记录我在使用 Kotlin 中遇到的问题,有注意事项,也有与 java 的比较,比较零散,持续更新,遇到问题再进行记录。

1、Kotlin 字符串的比较
在 Java 中 == 比较的是两个字符串的地址,而 Kotlin 是直接比较值,所以字符串比较可以直接使用 ==

val str1 = "success"
val str2 = "success"
if (str1 == str2) {
    // always true
}

2、Kotlin 可见性修饰符
Kotlin 有四种修饰符:private、protected、internal、public。默认修饰符为 public,可见性如下递增:

具体可以参考 :https://www.kotlincn.net/docs/reference/visibility-modifiers.html

下图是 java 可见性修饰符:

java 修饰符.png

3、Kotlin 中 ? 和 !! 的使用

// kotlin:
a?.foo()
// 相当于java:
if (a != null) {
    a.foo();
}

/** 分割线 **/

// kotlin:
a!!.foo()
// 相当于java: 
if (a != null) {
    a.foo();
} else {
    throw new KotlinNullPointException();
}

在平常开发中,能使用 ?. 就使用 ?. 吧, 如果用 !! 不小心崩溃就难受了

4、Kotlin 为 Intent() 设置 flags

// 清除栈里的所有 activity.  (要使用 Intent.addFlags,不能使用 Intent.flags 因为 Kotlin中 不能使用 | 符号) 
val intent = Intent(xxx, xxx)
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
startActivity(intent)

使用 Intent 发现没跳过去,也没崩溃。很有可能是出现了空指针,建议在使用 Intent 处打断点检查参数是否为空。

5、Kotlin 自增自减
Java 中有 a++ 和 a--,而 Kotlin 中不能这样写了。

// a.dec() 等同于 a-- 和 --a
a = a.dec() 
// a.inc() 等同于 a++ 和 ++a
a = a.inc()

注意:kotlin 的函数运算不会改变原有的值,例子如下:

var a = 0
println(a.inc)
println(a)

// 输出:
1
0

6、Kotlin 的 View.setOnLongClickListener 方法要有一个返回值。如果我们需要从 lambda 表达式中返回,我们必须给它加标签并用以限制 return。

// 写法1:使用标签来限制返回,标签与 lambda 函数同名
View.setOnLongClickListener @setOnLongClickListener{
    // TODO
    return@setOnLongClickListener
}
// 写法2:隐式标签,标签与 lambda 函数同名
View.setOnLongClickListener {
    // TODO
    return@setOnLongClickListener true
}

参考官方文档,标签处返回

7、在 Activity 中定义了一个 inner class Adapter,然后这个 Adapter 中定义了 interface,编译器就报错了。将 inner 去掉编译器就不报错了,难道是 Kotlin 的内部类不能定义接口?

inner class CallLogAdapter : RecyclerView.Adapter<CallLogAdapter.ViewHolder>() {
    // 定义这个接口时编译器就报错了
    interface OnItemClickListener {
        // interface is not allowed here
    }
}

8、待更新。。。

上一篇下一篇

猜你喜欢

热点阅读