此文章方便记录平常使用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