两种方式都可以 更推荐方式一
方式一
class TraceDataManager private constructor() {
companion object {
private val TAG = TraceDataManager::class.java.simpleName
@Volatile
private var instance: TraceDataManager? = null
fun getInstance(): TraceDataManager {
return instance ?: synchronized(this) {
instance ?: TraceDataManager()
}
}
}
fun setCurrentActivity(activity: Activity?) {
sCurrentActivityWeakRef = WeakReference<Activity>(activity)
}
}
调用示例
TraceDataManager.getInstance().setCurrentActivity(activity)
方式二 饿汉式 object 方式(object 关键字就是修饰单例的)
object MyActivityManager {
private val TAG = MyActivityManager::class.java.simpleName
fun setCurrentActivity(activity: Activity?) {
sCurrentActivityWeakRef = WeakReference<Activity>(activity)
}
}
调用示例
MyActivityManager.setCurrentActivity(activity)
有关Kotlin Companion 我们需要了解到的几个知识点 - 知乎
companion 的作用就是修饰 object的
可以匿名 不写类名
可以在companion 里面写变量相当于 这个变量相当于 java外部类 的静态变量
class TopLevelClass {
可以不写类名 匿名单例类
//省略了伴生对象的名称
companion object {
fun doSomeStuff(){
...
}
}
写了类名 FakeCompanion
//没有省略了伴生对象的名称
object FakeCompanion {
fun doOtherStuff() {
...
}
}
}
fun testCompanion() {
TopLevelClass.doSomeStuff()
TopLevelClass.Companion.doSomeStuff()
TopLevelClass.FakeCompanion.doOtherStuff()
}
如果在Java 中写同样的测试代码,代码稍有不同:
public void testCompanion() {
TopLevelClass.Companion.doSomeStuff();
TopLevelClass.FakeCompanion.INSTANCE.doOtherStuff();
}