kotlin知识点

  • 主构造函数里的参数,如果不声明为var或者val,则这个参数一般是用来初始化父类。它不算是这个类的字段,它的作用域只在主构造函数当中。
  • val 的对象不仅数据不能变, 引用也不能变。
  • //自定义的类似apply功能的顶层函数
    fun <T> T.build(block: T.() -> Unit): T {
      block()
      return this
    }
    //第一个T代表这个函数是泛型, 第二个T代表这个build函数是T这个类的扩展函数, 第三个T代表我传进去的函数类型的参数具有T这个类的上下文,第四个T代表函数返回类型是T
  • 像工具类这种功能,在kotlin中推荐用“单例类来实现”,但如果确实想要实现类似与类方法(静态方法)的方法的话:
    class Example{
    ...
    ...
     companion object {
      @JvmStatic   fun doAction(){   .... } } }
    //Example.doAction()

    第二种方法则是使用“顶层方法”

  • fun <T>later(block:() -> T) = Later(block)//封装的顶层函数
    
    //满足实现懒加载的类
    class Later<T>(val block:() -> T) {
        var value: Any? = null
    
        operator fun getValue(any :Any?, prop:KProperty<*>):T{
            if(value == null){
                value = block()
            }
            return value as T
        }
    }
    
    val p by Later<Int> {//第一种直接使用类的方法
        println("make when run")
        123
    }
    
    val q by later {//使用包装成了顶层函数的方法
        println("make when run too")
        "hello?"
    }
    fun main(){
        println("-----")
        println(p)
        println(p)
        println(q)
        println(q)
    }
    
    
    -----
    make when run
    123
    123
    make when run too
    hello?
    hello?

     

  • 如何去除 原生字符串 的前导空格

    val withoutMargin1 = """ |ABC |123 |456""".trimMargin() println(withoutMargin1) val withoutMargin2 = """ XYZ foo bar """ println(withoutMargin2)

     

  • 编译时常量只能在函数(指包括 main 在内的所有函数)之外定义。这是因为,编译时常量 必须在编译时(程序编译时)赋值,而 main 和其他函数都是在运行时(程序运行时)才调用, 函数内的变量也是在那时赋值。编译时常量要在这些变量赋值前就已存在。 因为使用复杂的数据类型可能会危害编译时的安全保障,所以编译时常量只能是一些常见的 基本数据类型。第 13 章会介绍数据类型构建的相关知识。以下是编译时常量支持的基本数据类型:  String  Int  Double  Float  Long  Short  Byte  Char  Boolean
posted @ 2021-04-20 23:26  ou尼酱~~~  阅读(121)  评论(0)    收藏  举报