對象聲明:創(chuàng)建單例易如反掌
Kotlin使用對象聲明功能能將類聲明與該類的單一實(shí)例聲明結(jié)合到一起浪慌。需要注意的是對象聲明可以包含屬性溜在、方法焰轻、初始化語句塊等的聲明宏浩,唯一不允許的就是構(gòu)造方法。
object Payroll{
val allEmployee = arrayListOf<Person>()
fun caculateSalary(){
for (person in allEmployee){
...
}
}
}
Payroll.allEmployee.add(Person("kdp",20))
Payroll.caculateSalary()
對象聲明同樣可以繼承類和接口
object CaseInsensitiveFileComparator : Comparator<File>{
override fun compare(o1: File, o2: File): Int = o1.path.compareTo(o2.path,true)
}
同樣也可以在類中聲明對象
伴生對象:工廠方法和靜態(tài)成員
在類中定義的對象可以使用一個(gè)特殊的關(guān)鍵字來標(biāo)記:companion
廓俭。這樣就可以直接通過容器類名稱來訪問這個(gè)對象的方法和屬性云石。不需要顯示的指明對象的名稱。有點(diǎn)類似于Java中的靜態(tài)方法的調(diào)用
class A{
companion object {
fun bar(){
println("This is a bar!")
}
}
}
A.bar()
伴生對象可以訪問類中的所有private成員研乒,包括private構(gòu)造方法
class User private constructor(val nickname:String){
companion object{
fun newSubscribingUser(email: String) = User(email.substringBefore('@'))
fun newFacebookUser(account:String) = User("facebook")
}
}
val subscribing = User3.newSubscribingUser("Subscribing")
val faceBook = User3.newFacebookUser("Facebook")
println(subscribing.nickname)
println(faceBook.nickname)
在伴生對象中實(shí)現(xiàn)接口
interface JSONFactory<T>{
fun fromJSON(jsonStr:String) : T
}
class Person(val name:String){
companion object : JSONFactory<Person>{
override fun fromJSON(jsonStr: String) : Person = ...
}
}
fun <T>loadFromJSON (fact:JSONFactory<T>) : T = fact.fromJSON("kdp")
loadFromJSON(Person) <!--將伴生對象實(shí)例傳給它-->
注意:Person類的名字被當(dāng)做JSONFactory的實(shí)例
伴生對象擴(kuò)展
伴生對象同樣可以用到擴(kuò)展函數(shù)上
class Person(val firstName:String,val lastName:String){
companion object{}
}
fun Person.Companion.fromJSON(json:String): Person{...} <!--聲明一個(gè)擴(kuò)展函數(shù)-->
val p = Person.fromJSON(json)
對象表達(dá)式:改變寫法的匿名內(nèi)部類
使用匿名內(nèi)部類實(shí)現(xiàn)事件監(jiān)聽
window.addMouseListener{
object : MouseAdapter(){
override fun mouseClicked(e:MouseEvent){
...
}
override fun mouseEntered(e:MouseEvent){
...
}
}
}
除了去掉了對象的名稱外汹忠,語法和對象聲明是相同的,對象表達(dá)式聲明了一個(gè)類并創(chuàng)建了該類的一個(gè)實(shí)例雹熬。
可以給對象分配一個(gè)名字宽菜,將其存儲(chǔ)在一個(gè)變量中
val listener = object : MouseAdapter(){
override fun mouseClicked(e:MouseEvent){
...
}
override fun mouseEntered(e:MouseEvent){
...
}
}
與Java匿名內(nèi)部類不同的是:Kotlin的匿名對象可以實(shí)現(xiàn)多個(gè)接口或者不實(shí)現(xiàn)接口
注意: 與對象聲明不同,匿名對象不是單例的竿报。每次對象表達(dá)式被執(zhí)行都被創(chuàng)建一個(gè)新的實(shí)例铅乡。