美文网首页
Kotlin| 实践

Kotlin| 实践

作者: 请叫我林锋 | 来源:发表于2019-11-28 23:05 被阅读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,可见性如下递增:

    • private:类内部可见
    • protected:类内部+子类可见
    • internal:同模块可见(Kotlin 在 Android 中的模块我概念还不是很清楚)
    • 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、待更新。。。

    相关文章

      网友评论

          本文标题:Kotlin| 实践

          本文链接:https://www.haomeiwen.com/subject/pqniwctx.html