代码改变世界

kotlin--Object关键字

  ttylinux  阅读(146)  评论(0编辑  收藏  举报
1.匿名内部类
Object可以实现,继承一个抽象类的同时,实现多个接口。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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.实现单例模式
1
2
3
object UserManager {
    fun login() {}
}

 

3.伴生对象,实现静态方法访问的效果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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实现单例模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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")
 
第一次判空,没有进入同步资源,避免同步开销;
第二次判空,进入同步块,确保只有一个线程去创建该对象。第二次判空的原因是,
有可能存在其他线程创建了该对象。
===================================================================================================
 
抽象类模板

  

 

 

相关博文:
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
点击右上角即可分享
微信分享提示