代码如下,问题:为什么又另外写一个 get() 方法呢? 上面那段不是可以获取到 instance 了吗?
companion object { var instance: RetrofitManager? = null get() { if (field == null) { field = RetrofitManager() } return field } fun get(): RetrofitManager { return instance!! } }
您的每一个用心回答,都会让这个世界变得更美好一些!
var instance: RetrofitManager? = null get() { if (field == null) { field = RetrofitManager() } return field }
这个get是instance,这个get是自定义的,那么每次访问该属性时都会调用这个方法。
fun get(): RetrofitManager { return instance!! }
这个是对外的。
估计是这个作者抄别人代码,没有抄全吧。
如果按你上面的代码,getInstance就可以获取到了。这个instance没有私有,也可以被外部setInstance。由此看来的确是没啥意义,直接就可以获取到了。
而 fun get(): RetrofitManager 最好加个锁或者做成同步代码块,如果多个线程同时进来获取的时候,刚地为null的,就创建两个对象了。
@Synchronized fun get(): RetrofitManager { return instance!! }
按道理来说 他应该这样写的:
companion object { // 单例可防止同时打开多个数据库实例(双重校验锁式(Double Check)单例)。 @Volatile private var sINSTANCE: RetrofitManager? = null @JvmStatic fun getInstance(): RetrofitManager { //如果 INSTANCE 不为空,则返回它,如果是,则创建 return sINSTANCE ?: synchronized(this) { val instance = RetrofitManager() sINSTANCE = instance // 返回实例 instance } } }
以上代码是我从官方示例里找的。如有用,请点赞、打赏。
你可以参考一下这个文档:
https://www.kotlincn.net/docs/reference/properties.html
这个get是instance,这个get是自定义的,那么每次访问该属性时都会调用这个方法。
这个是对外的。
估计是这个作者抄别人代码,没有抄全吧。
如果按你上面的代码,getInstance就可以获取到了。这个instance没有私有,也可以被外部setInstance。由此看来的确是没啥意义,直接就可以获取到了。
而 fun get(): RetrofitManager 最好加个锁或者做成同步代码块,如果多个线程同时进来获取的时候,刚地为null的,就创建两个对象了。
按道理来说 他应该这样写的:
以上代码是我从官方示例里找的。如有用,请点赞、打赏。
你可以参考一下这个文档:
https://www.kotlincn.net/docs/reference/properties.html