這一節(jié)用個小例子來理解下密封類及l(fā)et、run、apply、also、with之間的區(qū)別
Java有枚舉,Kotlin也有枚舉,但多了一個密封類,密封類就是子類有限的類
/**
* 密封類
*/
sealed class Language{
class Java : Language(){
fun println(){
println("${javaClass.name}")
}
}
class Kotlin : Language(){
fun println(){
println("${javaClass.name}")
}
}
class Python : Language(){
fun println(){
println("${javaClass.name}")
}
}
class Swift : Language(){
fun println(){
println("${javaClass.name}")
}
}
}
定義一個類
class Programmer(val name: String,val age: Int,val language: Language){
override fun toString(): String {
return "$name - $age - ${language.javaClass.simpleName} engineer"
}
fun work(){
println("$name codeing")
}
}
看看 let run apply also with 有什么區(qū)別
fun main(args: Array<String>) {
println("Hello World")
//fun <T, R> T.let(block: (T) -> R): R = block(this)
//可以使用it關(guān)鍵字返回實體,單入?yún)⒎祷刈詈笠恍? val programmer1 = Programmer("John",25,Language.Kotlin())
val ss = programmer1?.let {
println(it.toString())
it.work()
}
//fun <T, R> T.run(block: T.() -> R): R = block()
//可以使用this關(guān)鍵字返回實體,單入?yún)⒎祷刈詈笠恍? val programmer2 = Programmer("Aluxe",28,Language.Python())
programmer2?.run {
println(toString())
this.work()
}
//fun <T> T.apply(block: T.() -> Unit): T { block(); return this }
//可以使用this關(guān)鍵字返回實體,單入?yún)o返回。方法體返回this
val programmer3 = Programmer("Alice",21,Language.Swift())
programmer3?.apply {
println(this.toString())
}.work()
//fun <T> T.also(block: (T) -> Unit): T { block(this); return this }
//可以使用it關(guān)鍵字返回實體,單入?yún)o返回。方法體返回this
val programmer4 = Programmer("Chen",31,Language.Java())
programmer4?.also {
println(it.toString())
}.work()
//fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()
//可以使用this關(guān)鍵字返回實體,接收2個入?yún)ⅲ?個入?yún)⒎祷刈詈笠恍小? val programmer5 = Programmer("Smith",19,Language.Python())
with(programmer5){
println(this.toString())
work()
}
}