kotlin--Object關鍵字
2024-02-19 19:46 ttylinux 閱讀(190) 評論(0) 收藏 舉報1.匿名內部類
Object可以實現,繼承一個抽象類的同時,實現多個接口。
interface A {
fun funA()
}
interface B {
fun funB()
}
abstract class Man {
abstract fun findMan()
}
fun main() {
// 這個匿名內部類,在繼承了Man類的同時,還實現了A、B兩個接口
val item = object : Man(), A, B{
override fun funA() {
// do something
}
override fun funB() {
// do something
}
override fun findMan() {
// do something
}
}
}
2.實現單例模式
object UserManager {
fun login() {}
}
3.伴生對象,實現靜態方法訪問的效果
class Person {
// 改動在這里
// ↓
companion object InnerSingleton {
@JvmStatic
fun foo() {}
}
}
實現工廠模式:
User.create("Tome")
// 私有的構造函數,外部無法調用
// ↓
class User private constructor(name: String) {
companion object {
@JvmStatic
fun create(name: String): User? {
// 統一檢查,比如敏感詞過濾
return User(name)
}
}
}
4.Object實現單例模式
object UserManager {
// 對外暴露的 user
val user by lazy { loadUser() }
private fun loadUser(): User {
// 從網絡或者數據庫加載數據
return User.create("tom")
}
fun login() {}
}
UserManager.user
只有訪問的時候才加載用戶
======================================================================
伴生對象Double check
class UserManager private constructor(name: String) {
companion object {
@Volatile private var INSTANCE: UserManager? = null
fun getInstance(name: String): UserManager =
// 第一次判空
INSTANCE?: synchronized(this) {
// 第二次判空
INSTANCE?:UserManager(name).also { INSTANCE = it }
}
}
}
// 使用
UserManager.getInstance("Tom")
第一次判空,沒有進入同步資源,避免同步開銷;
第二次判空,進入同步塊,確保只有一個線程去創建該對象。第二次判空的原因是,
有可能存在其他線程創建了該對象。
===================================================================================================
抽象類模板
版權聲明:
作者:ttylinux
本文版權歸作者,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。
浙公網安備 33010602011771號