经常看到 val 和 var, 其区别是变量可以简单的定义为可变(var)和不可变(val)的两种类型的变量, 这个与java中的final相似. 不可变在kotlin(和其他很多现代语言)中是很重要的概念.\
打印:
val person = Person("小明")
println("person's name: ${person.name}")
data class Person(val name :String?)
二级构造函数
类也可以有二级构造函数,需要加前缀 constructor:
classPerson { constructor(parent: Person) {parent.children.add(this) }}
如果类有主构造函数,每个二级构造函数都要,或直接或间接通过另一个二级构造函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字:
classPerson(valname:String) {constructor (name:String, paret: Person) :this(name) {parent.children.add(this)}}
如果一个非抽象类没有声明构造函数(主构造函数或二级构造函数),它会产生一个没有参数的构造函数。构造函数是 public 。如果你不想你的类有公共的构造函数,你就得声明一个空的主构造函数:
classDontCreateMeprivateconstructor () {}
注意:在 JVM 虚拟机中,如果主构造函数的所有参数都有默认值,编译器会生成一个附加的无参的构造函数,这个构造函数会直接使用默认值。这使得 Kotlin 可以更简单的使用像 Jackson 或者 JPA 这样使用无参构造函数来创建类实例的库。
classCustomer(valcustomerName:String="")
重新实现Application单例化
在这个情景下,委托就可以帮助我们了。我们直到我们的单例不会是null,但是我们不能使用构造函数去初始化属性。所以我们可以使用notNull
委托:
class App : Application() {
companion object {
var instance: App by Delegates.notNull()
}
override fun onCreate() {
super.onCreate()
instance = this
}
}
这种情况下有个问题,我们可以在app的任何地方去修改这个值,因为如果我们使用Delegates.notNull()
,属性必须是var的。但是我们可以使用刚刚创建的委托,这样可以多一点保护。我们只能修改这个值一次:
companion object {
var instance: App by DelegatesExt.notNullSingleValue()
}
尽管,在这个例子中,使用单例可能是最简单的方法,但是我想用代码的形式展示给你怎么去创建一个自定义的委托。
/************************************** 未完待续 *************************************************/