Kotlin笔记

此文章方便记录平常使用kotlin容易忘记的点

1.kotlin单例模式

//1.饿汉式
object Singleton {
    ...
}

// Kotlin 中调用
Singleton.xx()

// Java 中调用
Singleton.INSTANCE.xx()

//2.懒汉式
class Singleton private constructor() {
    companion object {
        val instance: Singleton by lazy { Singleton() }
    }
}

// Kotlin 中调用
Singleton.instance.xx()

// Java 中调用
Singleton.Companion.getInstance().xx()

2.静态常量

//java中
 public static final String name = "XXX";

//kotlin中
companion object {
        val name = "XXX"
 }

3.静态方法

//java 
public class AppUtils {
    
    public static void getXX(){
        //........
    }
}
//kotlin 
//第一种
class Utils {
    
    companion object{
        fun getXX(){
            //.........
        }
    }
}
//第二种
object Utils {

    fun getXX(){
        //.........
    }
}

4.延迟初始化lateninit var和by lazy

//**初始化一个属性**//

//java 
private A a;

//kotlin
private var a:A?=null

//如果不想初始化时指定为null可以使用lateninit va。注意:`不能用来修饰局部变量`
//lateinit var只是让编译期忽略对属性未初始化的检查,让编译期在检查时不要因为属性变量未被初始化而报错。
//后续在哪里以及何时初始化还需要开发者自己决定。
private lateninit var a:A
//此时不指定=null编译器不会报错,在使用到时在初始化
a=A()
a.xxxx()

//by lazy
//必须使用val来声明,及声明不可变变量。声明时就指定了值相当于java的final
//注意:`可以使用于类属性或者局部变量`
private val a:A by lazy {A()}

5.‘lateinit’ modifier is not allowed on properties of a type with nullable 问题

出现这个问题一般是使用泛型时遇到的,例如如下代码

abstract class BasePresenter<View>() {
    ...
    protected lateinit var view: View //此时编译器就会标记此处有问题
    ...
}

##分析:
//当你没有对泛型参数应用任何边界时,它默认为 Any? 如下:

abstract class BasePresenter<View:Any?>() {
    ...
    protected lateinit var view: View //此时编译器就会标记此处有问题
    ...
}

lateinit使用规范:Kotlin中文文档
lateinit意义是延迟初始化;我的理解就是,需要一个全局变量,但是我不想一开始就初始化它,它告诉编译器我会在稍后的代码初始化变量,也就是这个变量不能为null,综上所述,泛型默认是Any?,是可以为空的所以会抛出异常。代码更改如下

abstract class BasePresenter<View:Any>() {
    ...
    protected lateinit var view: View //这样就不会报错了
    ...
}

6.Kotlin lateinit 和 by lazy 的区别

①lazy只能修饰val类型,lateinit只能修饰var类型。如下:

val view:TextView by lazy { TextView(this) }
lateinit var view:TextView

②lateinit不能修饰可空属性和JAVA基本数据类型

lateinit var age: Int  //会报错
 lateinit var age: Integer //正确

③lateinit修饰的属性可以多次初始化,val修饰的相当于常亮。

6.Kotlin isNullOrEmpty、isNotEmpty 、isEmpty的区别

//String的区别
isEmpty相当于->length == 0?
isNotEmpty相当于->length > 0
isNullOrEmpty相当于->string==null || length ==0

//List的区别
isEmpty相当于->list.size==0?
isNotEmpty相当于->!isEmpty->list.size!=0?
isNullOrEmpty相当于->list==null || list.size==0

//map区别
isEmpty相当于->map.size==0?
isNotEmpty相当于->!isEmpty->map.size!=0?
isNullOrEmpty相当于->map==null || map.size==0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值